heroku + Rails で npm / yarn が必要ならnode.jsのbuildpackを追加する必要があることを知っておこう

3 min read読了の目安(約3300字

buildpack とは

上記ドキュメントにもありますが、
heroku は git push heroku <branch> した時点で上記デフォルトで用意されている buildpack のリストから適切なものが検出され、Dynoコンテナアプリのコンパイルに使用されます。

Ruby on Rails のプロジェクトを push したときはこの buildpack から Ruby が検出され使用されることで Ruby の Dynoコンテナが起動するわけですね。

npm / yarn が必要なら node.js の buildpack を追加する必要がある

で、上記 Ruby の buildpack には node.js が含まれていないので、
Ruby on Rails アプリの実行に npm / yarn が必要なら
node.js の buildpack を追加で認識させてやらないとダメなんですね。
やり方はここに書いてあります

ただ、上記ドキュメントにもあるように Ruby on Rails アプリの場合は
buildpack の最後が Ruby buildpack でないと Ruby の Dynoコンテナとして立ち上がらないようなので、下記のように追加してやる必要があります。

# heroku リモートリポジトリを追加したディレクトリ配下で以下を実行
$ heroku buildpacks:add --index 1 heroku/nodejs
# 追加できているか確認
$ heroku buildpacks

これでOKです。

default では devDependencies の依存関係はビルドステップ完了後に削除される

パッケージのインストール
デフォルトでは、Heroku は package.json の dependencies および devDependencies に記載されているすべての依存関係をインストールします。
インストールおよびビルドステップを実行した後、 Heroku はアプリケーションをデプロイする前に、devDependencies に宣言されているパッケージを取り除きます。

もしビルドステップが完了した後も devDependencies の依存関係を残したい場合、
以下のconfigを設定しておく必要があります

## npm を使っている場合
heroku config:set NPM_CONFIG_PRODUCTION=false
## yarn を使っている場合
heroku config:set YARN_PRODUCTION=false

heroku yarn run で何でもできるわけじゃない

heroku は Dynoコンテナが再起動するので、tmp/ 配下にしかファイルを出力できないようです
(tmp/ 配下も再起動時には削除される)

# ファイルを出力するような node.js スクリプトは失敗する
heroku yarn run hogehoge.js

(未検証)ビルドプロセスに入れればファイル出力もできる……?

この記事を書いてる途中で気づいたのですが、
heroku は node.js のビルドプロセスとして buildstart コマンドを実行するようなので、この中に入れておけば tmp/ 配下以外へのファイル出力も実行してくれるのかも……?

package.json
"scripts": {
  "start": "node index.js",
  "build": "webpack",
  "heroku-prebuild": "echo This runs before Heroku installs your dependencies.",
  "heroku-postbuild": "echo This runs afterwards."
}

知っている人がいれば情報くれると嬉しいです。私も時間を見つけて検証したらここに追記します。

今回はここまでです。じゃ!