Чтобы сменить каталог внутри скрипта ruby?

101

Я хочу создать новое приложение rails и запустить сервер rails для этого приложения, все из сценария ruby.

Мой код выглядит так:

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

Однако при запуске «rails server &» путь находится не в папке my_app, а в родительской папке.

Есть ли способ изменить каталог внутри скрипта, чтобы я мог запускать «rails server», «rake about» и «rake db: migrate» для этого нового приложения?

Все советы по работе будут оценены.

never_had_a_name
источник
6
Обратите внимание, что лучший ответ - не отмеченный. Продолжайте читать до конца этой страницы.
Zane

Ответы:

105

Использование Dir.chdir:

Dir.chdir "my_app"
Адриан
источник
22
Имейте в виду, что это может иметь побочные эффекты на протяжении всей остальной части вашей программы. Смотрите другие ответы, чтобы избежать потенциальных ошибок.
Leopd
Это плохой ответ. Это решает проблему, но после нее может возникнуть проблема в коде. Пожалуйста, подумайте о смене «лучшего ответа» на другой (с большим количеством голосов)
Еж
367

Не слушайте их, Dir.chdir("dir")возможно, поступите неправильно. Вы почти всегда хотите ограничить изменение определенным контекстом, не затрагивая остальную часть программы следующим образом:

#!/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
тау
источник
Будьте очень осторожны при использовании блока в многопоточном приложении, например в том, которое использует sidekiq. Просто и к сведению :)
onetwopunch
@jryancanty Если я создам тему и сменил каталог, как в этом ответе, каковы будут «побочные эффекты», если они есть? (Я не буду использовать sidekick, просто Threadкласс)
onebree
1
Мне также любопытно, каковы побочные эффекты (от использования любого метода). Если вы измените рабочий каталог, вы всегда сможете вернуть его обратно, не так ли?
stevec
Не знаю ни одного случая, когда вы не можете ... просто сделайте original_directory = Dir::pwd, а затем вспомните переменную, например, так:Dir::chdir(original_directory)
Poyda
11

система поддерживает аргумент: chdir, который позволяет указать его рабочий каталог:

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

выходы '/ tmp'

Wondersz1
источник
3

Используется Dir.chdirдля изменения рабочего каталога сценария.

мипади
источник
1

Почему бы тебе просто не сделать это так:

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'
Гаурав Манчанда
источник
1
При сбое системной команды будет сложнее диагностировать, что пошло не так - сбой приложения rails, сбоя компакт-диска или сбоя сервера rails?
ablarg
1

Следующие строки имеют такой же результат:

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

также вы можете запустить rails и создать приложение (это может быть полезно в тестах rspec и т. д.):

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

и когда-либо вы можете запустить сервер rails;)

Итниколай
источник