要在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服务器”,“ rake about”和“ rake db:migrate”?

所有围绕技巧的工作将不胜感激。


6
请注意,最佳答案不是标记的答案。继续阅读本页底部。
Zane 2014年

Answers:


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

@jryancanty如果我创建线程,并像此答案中那样更改目录,那么“副作用”是什么(如果有)?(我不会使用同伴,只是Thread上课)
onebree

1
我还对副作用有什么好奇(使用任何一种方法)。如果更改工作目录,则可以随时将其更改为对吧?
stevec '19

不知道任何时候您都做不到,只是做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应用程序是否失败,cd失败还是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服务器;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.