bowerを利用しているRailsアプリをherokuにデプロイする方法について

こんにちは。今日、お昼に蕎麦を食べようと思って、帰りにも蕎麦を食べようと思って何かおかしいと感じたきたけーです(カレーにしよう)。

今日は、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というビルドパックに切り替えました。