Capistranoタスクの中でbundle execする

ローカルのRailsアプリディレクトリでとあるrakeタスクを実行する処理をCapistranoのタスクで実行したかったです。こういう感じです。

Capfile
task :korejikkou do
  run <<-CMD
    cd #{toaru_rails_dir}
    bundle exec rake toaru
  CMD
end

これを

$ bundle exec cap

で実行すると、korejikkouの中のbundle execはcapコマンドを実行したディレクトリベースで動いてしまいます。。
困った。
こちらにあるように、bundle installには任意のGemfileを指定できるオプションがあるようですが、bundle exec にはないみたいです。
bundle のなかで bundle する

が、bundlerではBUNDLE_GEMFILEという環境変数にGemfileの場所がセットされるらしく、これを書き換えると意図してたことができました。

Capfile
task :korejikkou do
  org_gemfile = ENV['BUNDLE_GEMFILE']
  ENV['BUNDLE_GEMFILE'] = "#{toaru_rails_dir}/Gemfile"

  run <<-CMD
    cd #{toaru_rails_dir}
    bundle exec rake toaru
  CMD

  ENV['BUNDLE_GEMFILE'] = org_gemfile
end

(あとで気づいたが、bundle install –gemfileしてからbundle exec すれば指定したGemfileが使われるんだろう。きっと)

Comments