我正在使用 capistrano 进行部署。我正在尝试定义一个任务,它将:
cd other-rails-app && bundle exec rake sometask
但它抱怨 Rake 不是捆绑包的一部分(这在我试图运行此任务的项目中显然不是真的)。我认为它必须在执行命令之前以某种方式改变环境并假设已经加载了捆绑程序(这在 capistrano 任务中是正确的,但它是错误的 Gemfile)。
如何在干净的环境中使用 capistrano 在本地运行命令?
我正在使用 capistrano 进行部署。我正在尝试定义一个任务,它将:
cd other-rails-app && bundle exec rake sometask
但它抱怨 Rake 不是捆绑包的一部分(这在我试图运行此任务的项目中显然不是真的)。我认为它必须在执行命令之前以某种方式改变环境并假设已经加载了捆绑程序(这在 capistrano 任务中是正确的,但它是错误的 Gemfile)。
如何在干净的环境中使用 capistrano 在本地运行命令?
我解决了这个问题。当你运行 capistrano 时,BUNDLE_GEMFILE
环境变量被设置为当前项目的 Gemfile。因此,当您运行时bundle exec rake
,Bundler 会首先查看环境中设置的 Gemfile。解决方案是“重置”这个 Gemfile 变量。我创建了一个脚本,用于在我的另一个项目的根目录中运行我的 rake 任务。
所以不要这样做:
run_locally "cd other-rails-app && bundle exec rake mytask"
我这样做:
run_locally "cd other-rails-app && ./mytask.rb"
在mytask.rb
文件中我这样做:
#!/usr/bin/env ruby
ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', File.dirname(__FILE__))
require 'bundler/setup'
%x{rake mytask}