Чтобы сменить каталог внутри скрипта 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» для этого нового приложения?

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


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'




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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.