Aby zmienić katalog w skrypcie ruby?

100

Chcę stworzyć nową aplikację railsową i odpalić serwer railsowy dla tej aplikacji, wszystko począwszy od skryptu ruby.

Mój kod wygląda tak:

#!/usr/bin/env ruby
system "rails new my_app"
system "cd my_app"
system "rails server &"

Jednak w przypadku uruchomienia „serwera rails &” ścieżka nie znajduje się w folderze my_app, ale w folderze nadrzędnym.

Czy istnieje sposób na zmianę katalogu w skrypcie, tak żebym mógł uruchomić „serwer railsowy”, „rake about” i „rake db: migrate” dla tej nowej aplikacji?

Wszelkie obejścia wskazówek będą mile widziane.

Never_had_a_name
źródło
6
Zwróć uwagę, że najlepsza odpowiedź nie jest zaznaczona. Czytaj dalej do końca tej strony.
Zane,

Odpowiedzi:

104

Zastosowanie Dir.chdir:

Dir.chdir "my_app"
Adrian
źródło
22
Pamiętaj, że może to mieć skutki uboczne w pozostałej części programu. Zobacz inne odpowiedzi, aby uniknąć potencjalnych błędów.
Leopd
To zła odpowiedź. Rozwiązuje problem, ale po nim możesz mieć problem z kodem. Proszę rozważyć zmianę „najlepszej odpowiedzi” na inną (z większą liczbą głosów pozytywnych)
Ezh
366

Nie słuchaj ich, Dir.chdir("dir")prawdopodobnie zrobi źle. Prawie zawsze chcesz ograniczyć zmiany do określonego kontekstu, nie wpływając na resztę programu w następujący sposób:

#!/usr/bin/env ruby
system "rails new my_app"
Dir.chdir("my_app") do
  system "rails server &"
end
# back where we were, even with exception or whatever
wyprawiać
źródło
Bądź bardzo ostrożny, używając bloku w aplikacji z wątkami, takiej jak ta, która używa sidekiq. Just and FYI :)
onetwopunch
@jryancanty Jeśli utworzę wątek i zmienię katalog, jak w tej odpowiedzi, jakie są "skutki uboczne", jeśli występują? (Nie Thread
użyję
1
Jestem również ciekawy, jakie są skutki uboczne (przy stosowaniu którejkolwiek metody). Jeśli zmienisz katalog roboczy, zawsze możesz go zmienić z powrotem, prawda?
stevec
Nie znam żadnych original_directory = Dir::pwdDir::chdir(original_directory)
momentów
11

system obsługuje: chdir argument, który pozwala określić jego katalog roboczy:

system("echo Test; pwd", chdir: '/tmp')

wyjścia '/ tmp'

wondersz1
źródło
3

Służy Dir.chdirdo zmiany katalogu roboczego dla skryptu.

mipadi
źródło
1

Użyj Dir.chdir („[aString]”)

user402987
źródło
1

Dlaczego nie możesz tego zrobić w ten sposób:

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'
Gaurav Manchanda
źródło
1
Gdy polecenie systemowe zawiedzie, trudniej będzie zdiagnozować, co poszło nie tak - czy aplikacja railsów zawiodła, czy zawiodła płyta cd, czy też awaria serwera railsowego?
ablarg
1

Następujące wiersze mają ten sam wynik:

puts Dir.chdir("/tmp") { IO.popen("ls -la") { |io| io.read } } 

puts IO.popen(["ls", "-la", "/tmp"]).read

puts IO.popen("ls -la /tmp").read

# drwxrwxrwt 25 root       root       16384 июля  23 01:17 .
# drwxr-xr-x 22 root       root        4096 июля  22 13:36 ..
# drwxrwxr-x 12 itsnikolay itsnikolay  4096 июля  19 17:14 app_template
# drwx------  2 itsnikolay itsnikolay  4096 июля  21 15:04 .com.google.Chrome.dThb8f
# drwx------  2 itsnikolay itsnikolay  4096 июля  18 20:55 .com.google.Chrome.FGDBGc

możesz także uruchomić railsy i stworzyć aplikację (może to być pomocne w testach rspec itp.):

IO.popen("cd /tmp/ && rails new test_app").read

i kiedykolwiek możesz uruchomić serwer railsowy;)

itsnikolay
źródło