rake任务在另一个项目中执行bundle install

时间:2015-06-30 20:01:23

标签: ruby-on-rails ruby bash rake bundle

如何编写rake任务以在其他项目中运行bundle install?我用rake创建了一个项目,并编写了像这样的任务

setTimeout(
  function() 
  {
    fillColorOrPattern('s6image',currentFill);
  }, 5);

但是当我跑步时,我得到了:

task :bundle do
  projects.each do |name, repo|
    if Dir.exists?("../#{name}")
      exec("cd ../#{name} && bin/bundle install")
    end
  end
end

一开始看起来不错,但实际上是当前rake-only项目的Using rake 10.3.2 Using bundler 1.9.6 Bundle complete! 1 Gemfile dependency, 2 gems now installed. Use `bundle show [gemname]` to see where a bundled gem is installed. 而不是目标rails项目。

我也试过了回答

bundle install

但它也是如此。我还尝试了puts `cd ../#{name} && bin/bundle install` 而不是bundle install,但它没有用。

当我直接在命令上运行它时,它会按照我的期望完成:

bin/bundle install

如何让它做正确的Using rake 10.4.2 Using CFPropertyList 2.3.1 ... ... Using turbolinks 2.5.3 Using uglifier 2.7.1 Bundle complete! 34 Gemfile dependencies, 120 gems now installed. Use `bundle show [gemname]` to see where a bundled gem is installed.

1 个答案:

答案 0 :(得分:2)

有关此事项的注意事项

bin/bundle仅在bundle目录中存在bin文件时才有效

  • 在shell中执行命令有许多不同的方法
    • exec('echo "Hello World"') - 运行命令并用它替换当前进程。
    • system('echo "Hello World"') - 在子shell中运行命令并捕获退出状态代码
    • `echo "hello world"` - 在子shell中运行命令并将所有输出捕获到STDOUT和STDERR,但不捕获退出状态代码。

为什么它没有工作

您需要为bundler提供干净的环境,以便它知道您正在捆绑其他项目。使用Bundler.with_clean_env块围绕rake任务中的命令,如下所示

task :bundle do
  Bundler.with_clean_env do
    projects.each do |name, repo|
      if Dir.exists?("../#{name}")
        exec("cd ../#{name} && bundle install")
      end
    end
  end
end