Чтобы сменить каталог внутри скрипта 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.