Щоб змінити каталог всередині сценарію з рубіном?


100

Я хочу створити нову програму для рейків і запустити сервер рейлів для цього додатка, все від сценарію рубіну.

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

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

Однак при запуску "сервера рейлів &" шлях знаходиться не в папці my_app, а в батьківській папці.

Чи є спосіб змінити каталог всередині сценарію, щоб я міг запустити "сервер рейлів", "рейк про" та "рейк db: міграція" для цього нового додатка?

Вся робота навколо порад буде вдячна.


6
Зауважте, що найкраща відповідь - це не позначена. Продовжуйте читати внизу цієї сторінки.
Зейн

Відповіді:


104

Використання Dir.chdir:

Dir.chdir "my_app"

22
Пам’ятайте, що це може мати побічні ефекти протягом усієї вашої програми. Дивіться інші відповіді, щоб уникнути можливих помилок.
Леопд

Це погана відповідь. Він вирішує проблему, але ви можете мати проблему в коді після неї. Будь ласка , зверніть увагу , щоб змінити «краща відповідь» на інший (з більш upvotes)
Їжак

366

Не слухайте їх, 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. Just and FYI :)
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

також ви можете запустити рейли та створити додаток (це може бути корисно в тестах rspec тощо):

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

і коли-небудь ви можете запустити сервер рейлів;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.