Rubyスクリプト内のディレクトリを変更するには?


100

新しい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

回答:


104

使用Dir.chdir

Dir.chdir "my_app"

22
これは、プログラムの残りの部分で副作用を引き起こす可能性があることに注意してください。これによる潜在的なバグを回避するには、他の回答を参照してください。
Leopd 2012年

これは悪い答えです。問題は解決しますが、その後のコードで問題が発生する可能性があります。「ベストアンサー」を別の質問(賛成票が多い)に変更することを検討してください
Ezh

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 2014年

@jryancantyスレッドを作成し、この回答のようにディレクトリを変更した場合、「副作用」は何ですか?(私はThread
相棒を

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 appは失敗しましたか、cdは失敗しましたか、それともrails serverは失敗しましたか?
ablarg 2015年

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

そしてこれまでに、railsサーバーを実行できます;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.