動かざることバグの如し

近づきたいよ 君の理想に

Capistrano3でdefault_envとかwithinが効かないとき

環境

症状

Capistranoは非常に便利なデプロイツールで、Railsをデプロイするなら必須だと思う。いろいろ機能があって、その中でもdefault_envでexecuteするときの環境変数を設定できたり、withinでそのディレクトリの中で実行とかできる。。はずなのだが何回やってもうまくいかない

原因

書き方が悪い

どういうことか

withinの場合。例えばrelease_path以下内で実行したいとき、以下は有効

task :touch do
    on roles(:all) do
      within release_path do
        execute :touch, "hogehoge.txt"
      end
    end
  end

下はうまくいかない例

# not work!!!
task :touch do
    on roles(:all) do
      within release_path do
        execute "touch hogehoge.txt"
      end
    end
  end

違いがおわかりだろうか、executeのあとにシンボルを渡さないとwithinは効かない

だからexecuteを実行する際は、

execute :実行したいコマンド名 "コマンドの引数"

にしなくてはいけない

default_envにしてもそうで、

set :default_env, {
  "PATH" => "/opt/php/php-7.1.3/bin:$PATH"
}

とかで環境変数をセットできるがexecuteをシンボルで渡さないと反映されない。

割とハマってのでメモ てか駄目なら駄目でエラーとかになってくれ。。。

参考リンク