こんにちは。今日、お昼に蕎麦を食べようと思って、帰りにも蕎麦を食べようと思って何かおかしいと感じたきたけーです(カレーにしよう)。
今日は、bowerを利用しているRailsアプリをherokuにデプロイする方法について紹介します。bowerをJSライブラリのバージョン管理に利用している場合には、当然ですがnodeが必要になります。Railsのアプリでは、デフォルトでrubyのbuildpackが使われているため、nodeは入っていません。
rubyとnodeのbuildpack、両方を利用する
なにはともあれ、nodeの環境が必要です。herokuで複数のbuildpackを利用できるbuildpack、multi-buildpackが公開されているので、それを利用します。
heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
利用するbuildpackを.buildpacks
に記述します。
https://github.com/heroku/heroku-buildpack-nodejs https://github.com/heroku/heroku-buildpack-ruby
bower installをどのように行うか
nodeの環境は整いましたが、肝心のbowerがいないのと、どのタイミングでbower installを行うべきかという課題が残っています。
この問題に対応するためにRailsのプロジェクト配下にpackage.jsonを設置します。
nodeのbuildpackが適用されるタイミングでnpm install
が走り、bowerがインストールされます。その後、postinstallフックによりbower install
を実行します。
{ "name": "my-project", "version": "1.0.0", "dependencies": { "bower": "~1.2" }, "engine": { "node": "0.10.x", "npm": "1.3.x" }, "scripts": { "postinstall": "./node_modules/.bin/bower install" } }
rails-assetsという選択肢もある
近頃、rails-assetsというbundlerを経由して、jsのライブラリパッケージの依存関係を解決、インストールできる仕組みを知ったのですが、利用しているいくつかのライブラリが取得できなかったため、導入を見送りました。利用できるならば、nodeの実行環境も不要なので、この方法を使うのが吉だと思います。
追記: ruby-bowerという選択肢もある
この記事の方法だと、一回一回のビルドに時間がかかるのと、bower installで失敗するケースがときどき発生するので、ruby-bowerというビルドパックに切り替えました。