CapistranoはRailsのデプロイツールとしてメジャーだけど、Rails以外のアプリケーションのデプロイもできる。
ただ、デフォルトの設定のままだと、デプロイ時に、ログファイルやPIDファイルの格納先へシンボリックリンクをはったり、publicフォルダ以下のimages、javascripts、stylesheetsフォルダに格納されてるリソースファイルに対しtouchコマンドを実行する。
Railsだと構成上、↑の処理をしてくれて便利だけど、Rails以外のアプリケーションでは↑のような構成も無いので、デプロイの途中でエラーになる。
そんなRails以外のアプリケーションでCapistranoを使う場合、↓のサイトで紹介されてるように、deploy.rb内で、該当するCapistranoのタスクをオーバーライドする必要がある。
CapistranoをRails以外で使う方法 - jesterseraの日記
cap deploy:updateすると↓のupdate_codeがコールされる。
task :update_code, :except => { :no_release => true } do on_rollback { run "rm -rf #{release_path}; true" } strategy.deploy! finalize_update end task :finalize_update, :except => { :no_release => true } do run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true) # mkdir -p is making sure that the directories are there for some SCM's that don't # save empty folders run <<-CMD rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids && mkdir -p #{latest_release}/public && mkdir -p #{latest_release}/tmp && ln -s #{shared_path}/log #{latest_release}/log && ln -s #{shared_path}/system #{latest_release}/public/system && ln -s #{shared_path}/pids #{latest_release}/tmp/pids CMD if fetch(:normalize_asset_timestamps, true) stamp = Time.now.utc.strftime("%Y%m%d%H%M.%S") asset_paths = %w(images stylesheets javascripts).map { |p| "#{latest_release}/public/#{p}" }.join(" ") run "find #{asset_paths} -exec touch -t #{stamp} {} ';'; true", :env => { "TZ" => "UTC" } end end
ただ、今回はtouchコマンドだけを実行したく無かったので↑のfinalize_updateメソッドを見る限り、deploy.rb内で
set :normalize_asset_timestamps, false
と宣言すれば、touchコマンドは実行されなくなるので、エラー自体は無くなる。
この他にもやりたい処理がある場合は、↑のメソッドをオーバーライドする必要がある。