【问题标题】:To change directory inside a ruby script?要更改 ruby​​ 脚本中的目录?
【发布时间】:2011-03-21 08:56:51
【问题描述】:

我想创建一个新的 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”?

我们将不胜感激。

【问题讨论】:

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

标签: ruby-on-rails ruby


【解决方案1】:

不要听他们的,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 的应用程序)中使用块时要非常小心。仅供参考:)
  • @jryancanty 如果我创建一个线程,并像这个答案一样更改目录,如果有的话,“副作用”是什么? (我不会用sidekick,只是Thread类)
  • 我也很好奇副作用是什么(使用任何一种方法)。如果你改变了工作目录,你总是可以把它改回来的,对吧?
  • 不知道有什么时候你不能......只是做original_directory = Dir::pwd,然后像这样调用变量:Dir::chdir(original_directory)
【解决方案2】:

使用Dir.chdir:

Dir.chdir "my_app"

【讨论】:

  • 请记住,这可能会对您程序的其余部分产生副作用。查看其他答案以避免由此产生的潜在错误。
  • 这是一个糟糕的答案。它解决了这个问题,但是在它之后你可能会在代码中遇到问题。请考虑将“最佳答案”更改为另一个(有更多赞成票)
【解决方案3】:

系统支持 :chdir 参数,允许您指定其工作目录:

system("echo Test; pwd", chdir: '/tmp')

输出'/tmp'

【讨论】:

    【解决方案4】:

    使用Dir.chdir 更改脚本的工作目录。

    【讨论】:

      【解决方案5】:

      你为什么不能这样做:

      #!/usr/bin/env ruby
      system 'rails new myapp && cd myapp && rails server &'
      

      【讨论】:

      • 当系统命令失败时,将更难诊断出了什么问题——rails 应用程序失败了,cd 失败了,还是 rails 服务器失败了?
      【解决方案6】:

      以下行具有相同的输出:

      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 服务器 ;)

      【讨论】:

        【解决方案7】:

        使用 Dir.chdir("[aString]")

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-12
          • 1970-01-01
          • 2017-11-27
          • 1970-01-01
          • 2010-11-28
          • 2019-07-27
          • 1970-01-01
          • 2010-10-05
          相关资源
          最近更新 更多