既存のRailsアプリを5.1系にアップデートしたものの、フロント系のライブラリの管理にyarnを使ってなかったので、yarnを使うように修正しました。そして、いざHerokuにデプロイしたら、assets:precompile
でエラーが発生して落ちてしまいました。
原因は、JSのライブラリがないから。
最初からRails5.1+webpackerの組み合わせのアプリはHerokuにデプロイしたことがあって、そのときは特に何も考えなくても普通にデプロイできたのに、はて…。という感じで、原因がわからなかったのですが、Herokuの記事を見ると、webpackerがあることを検出すると、yarnのインストールを行い、フロント系のライブラリをインストールした後にassets:precompile
が行われるようです。
Heroku Dev Center: Ruby apps now get Yarn installed when the Webpacker gem is present
しかし、webpackerは使っていないので、わざわざyarn installのためにgemを入れたくありません。
調べたら解決法がありましたので残しておきます。
rake assets:precompileの前に処理を差し込む
rake taskは実行前、実行後に処理を差し込むことができます。
HsbtDiary: Rakeで任意のタスクの前後に別のタスクを実行する
ここでは、assets:precompile
の前に、yarn install
を行わせる処理を入れました。
task :js_deps_install do
sh "yarn install"
end
require File.expand_path('../config/application', __FILE__)
Rails.application.load_tasks
# この1行を追加
Rake::Task["assets:precompile"].enhance [:js_deps_install]
herokuのbuildpacksの順番を変更する
通常のRailsアプリであれば、buildpacksはheroku/ruby
のみだと思います。
ここに、heroku/nodejs
を追加するのですが、順番が重要です。
- heroku/nodejs
- heroku/ruby
にしなければなりません。
heroku buildpacks:add --index 1 heroku/nodejs
先頭がnodejsだと、最初にyarnのインストールが実行されるようになります。
2番目にすると、yarnのインストールが実行されないので注意してください。
いざデプロイ!
あとはデプロイするだけです。
git push heroku master
これで、HerokuにRails5.1&yarn(webpackerなし)のアプリをデプロイできました。