2016-03-25 14:58:16 +0900
Herokuで運用しているRailsアプリのJS依存管理をBowerからnpmへ移行しました。
これまで、Herokuで運用しているRailsアプリにおいて各種JavaScript/CSSパッケージの依存管理をBower(およびqnyp/heroku-buildpack-ruby-bower)で行ってきましたが、
- npmによる依存管理でも同じことが実現できるようになった
- Rails内にES6環境を構築するにあたってnpmを利用する必要がでてきた
という理由から、Bowerではなくnpmを利用する構成に移行しました。
具体的な作業手順は以下のとおりです。
まず、npm init
コマンドでRailsプロジェクトのルートディレクトリにpackage.json
を生成します。
$ npm init
bower.json
に記載していた依存パッケージのエントリをpackage.json
に記載します。この際、パッケージ名が変わるものもあるので https://www.npmjs.com/ でnpmにおけるパッケージ名を調べておきます。
依存パッケージをnpmでインストールします。
$ npm install
これによって、Railsプロジェクトのルートディレクトリにnode_modules
ディレクトリが作成され、その中にパッケージがインストールされます。node_modules
は.gitignore
に追加しておき、リポジトリには含まれないようにしておきます。
Railsの設定に以下の記述を追加します。
Rails.application.config.assets.paths << Rails.root.join('node_modules/')
これによって、npmでインストールされたパッケージのファイルをapp/assets/javascripts/application.js
などから//= require
ディレクティブで参照できるようになります。指定する際はnode_modules/
からの相対パスを記述します。
Herokuにデプロイする際にnpm install
が実行されるようにするために、HerokuアプリのBuildpackとしてheroku/nodejs
とheroku/ruby
を設定します。
$ heroku buildpacks:set heroku/ruby
$ heroku buildpacks:add --index 1 heroku/nodejs
設定した結果、以下のようにheroku/nodejs
が先に実行されるようになっている必要があります。
$ heroku buildpacks
=== myapp Buildpack URLs
1. heroku/nodejs
2. heroku/ruby
以上で、Herokuへのデプロイ時にnpmによって依存パッケージがインストールされるようになります。