やりたいこと
githubから取ってきたソースを圧縮してデプロイ先に転送する時に、javascriptをbuildした結果を一緒に送りたい。
前提
- 諸事情によりcapistrano2
- javascriptは
app/assets以下ではなく、frontフォルダ以下で管理して、ES6で書いてる - 最終的には
app/assets以下にbabelでビルドした結果を置いて、assets pipelineに載せたい(digestつけたい)
解決策
build_scriptを使おう。
http://www.rubydoc.info/gems/capistrano/2.15.0/Capistrano/Deploy/Strategy/Copy
set :build_script, 'cp -r node_modulesのインストール先 node_modules && npm install && gulp build && cp -r node_modules node_modulesのインストール先'
build_scriptは、ソースをgzして転送する前に取得したソースのルートディレクトリ上で任意のコマンドを実行できる。githubをリポジトリとして使っているのであれば、git cloneしたものを圧縮する前にbuild_scriptで指定した任意のスクリプトを走らせられるイメージ。
git cloneしてきたものは/tmpフォルダ以下に保存され、デプロイが終わるとディレクトリごと消される。つまり、npm installすると0からインストールしなおすことになりいまいち。そこで、あらかじめ/tmp以外の場所にデプロイ時に使うモジュールをインストールするディレクトリを用意しておき、build_script内で都度コピーしてきている。
シンボリックリンクを使わない理由は、gulp build時のモジュールの依存解決ができずmodule not foundになるものがあったため。うまい方法がわからず、とりあえず実ファイルをコピーするようにした。
capistrano3では?
そもそもcapistranoがnpmに対応しているので、きっとこんなことやらんでも済むのかなー。
https://github.com/capistrano/npm/