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.