rake 任务在另一个项目中执行捆绑安装

rake task to perform bundle install in another project

如何将 rake 任务写入 运行 不同项目中的捆绑包安装?我用 rake 创建了一个项目,并编写了这样的任务

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

但是当我 运行 我得到:

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.

乍一看还不错,但实际上是当前仅抽取项目的 bundle install,而不是目标 rails 项目。

我也试过反勾

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.

如何让它做正确的事情 bundle install

有几点需要注意

bin/bundle 仅当 bundle 文件存在于 bin 目录

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

为什么它不起作用

您需要为捆绑器提供一个干净的环境,以便它知道您正在捆绑一个不同的项目。按照下面的

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