capistranoでbundle installする

Capfileで

run "cd #{release_dir}; bundle install vendor/bundle --without test development --deployment"

とか書いてたけど、bundlerの公式サイト見てたら、capistrano用のbundle installタスクが用意されてることに気づいた。

使い方

Capfileの中で

require "bundler/capistrano"

としておくと、 cap deploy:update_code が呼ばれたあとに bundle install してくれるようになる。

仕組み

コードを見れば一目瞭然です。

# http://github.com/carlhuda/bundler/blob/master/lib/bundler/capistrano.rb

# Capistrano task for Bundler.
#
# Just add "require 'bundler/capistrano'" in your Capistrano deploy.rb, and
# Bundler will be activated after each new deployment.

Capistrano::Configuration.instance(:must_exist).load do
  after "deploy:update_code", "bundle:install"

  namespace :bundle do
    desc <<-DESC
      Install the current Bundler environment. By default, gems will be \
      installed to the shared/bundle path. Gems in the development and \
      test group will not be installed. The install command is executed \
      with the --deployment and --quiet flags. You can override any of \
      these defaults by setting the variables shown below. If capistrano \
      can not find the 'bundle' cmd then you can override the bundle_cmd \
      variable to specifiy which one it should use.

        set :bundle_gemfile,      fetch(:latest_release)+"/Gemfile"
        set :bundle_dir,          fetch(:shared_path)+"/bundle"
        set :bundle_flags,       "--deployment --quiet"
        set :bundle_without,      [:development, :test]
        set :bundle_cmd,          "bundle" # e.g. change to "/opt/ruby/bin/bundle"
    DESC
    task :install, :except => { :no_release => true } do
      bundle_cmd     = fetch(:bundle_cmd, "bundle")
      bundle_flags   = fetch(:bundle_flags, "--deployment --quiet")
      bundle_without = [*fetch(:bundle_without, [:development, :test])].compact
      bundle_dir     = (fetch(:bundle_dir, nil)     || fetch(:shared_path)+"/bundle")
      bundle_gemfile = (fetch(:bundle_gemfile, nil) || fetch(:latest_release)+"/Gemfile")

      args = ["--gemfile #{bundle_gemfile}"]
      args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty?
      args << bundle_flags.to_s
      args << "--without #{bundle_without.join(" ")}" unless bundle_without.empty?

      run "#{bundle_cmd} install #{args.join(' ')}"
    end
  end
end

bundle_gemfileやらbundle_flagsといったオプションもあることが分かります。
ほとんど何も書かなくていいってのは楽ですね。