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.


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"

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

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'




1

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

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'

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;)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.