Capistrano version 3.0 で rake を bundle exec rake にする方法


こんにちは。森谷です。

今回は RoR に戻りまして、 Capistrano の最新バージョン( 3.0 )を使ってみて、引っかかったところのお話です。 Capistrano は有名で便利なツールですが、 3.0 にアップデートされて大きく変更されたので、役に立つかもと思います。

さて、タイトルにある通り Capistrano に rake させるとき、バージョン 2.x ならば、

としたり、

とかすると rake のところを bundle exec rake に変えて実行してくれるのですが、 3.0 だとこれが出来ません(現時点では)。
ではどうするのか? … っといって勿体ぶってもしょうがないので、ドン( https://github.com/capistrano/capistrano/issues/639 )

ほほう、 SSHKit ってことは、 Capistrano の ssh でやりとりする部分をラップしてくれてる奴なんだな、と思ったあなたは普通。 SSHKit でそれ処理するのどうなの?って思ったあなたは偉い。 俺のリポジトリクローンしろよってコメントしてくれるあなたは神。

少し解説をすると、 3.0 で普通にコマンド実行する際は

とかするのですが、この execute っていうのがそもそも SSHKit で定義された関数で、内部的には端的に言って第一引数を to_s した文字列を第二引数以降とスペースで join して実行しています。そして、もう少し詳しく言えば、第一引数がスペースを含まない場合、SSHKit の 一番奥の奥

で command_map が呼ばれます。

ほげぇ … と食傷気味のあなたにもう一つ小ネタを。

3.0 で新しく生まれ変わったファイルのアップロード方法ですが、

https://github.com/capistrano/capistrano/pull/614 にある通りアップロード先が shared_path に限定されています。ので release_path とかを使いたい場合は、ちょっと remote_file の定義を変更したものがこちらにありますのでご覧ください(ただし Capistrano 3.0 作成者曰く今月末にはアップデートがあるっぽいのでそれを待てば良さそう)。

この記事に対してコメントを書く