Rubyが好きなプログラマーの日記。日々の生活、開発に関するメモとか考えとか。
最近、Capistrano 3 を使ってgit cloneしたり、デプロイするなどゴニョゴニョするタスクを書いている。 個人的には、そういったデプロイ関連のツールはアプリケーション本体とは切り離して、別のリポジトリで管理する方が好きなので、そこをbundlerでgemの管理をしている。
で、そんなgem管理の元で、
task :bundle_locally do
run_locally do
within fetch(:rails_root) do
execute :bundle, :install
end
end
end
みたいにbundlerをローカルホストで実行するようなタスクを、bundle exec cap stage bundle_locally
とやってしまうと、期待した動作をしてくれない。
というのは、当たり前といえば当たり前で、Capタスクをbundler経由で実行した際に、BUNDLER_なにがしな環境変数が定義され、それらを引き継いだまま内部のbundlerが実行されるためだ。
Capistranoを実行するときは、bundler経由にしない方が無難そう。
Bundler.with_clean_env
を使えば出来そうではあるが、タスクのコードが見やすいかというと、ブロックネスト地獄になるので、控えたい。