heroku + Rails で npm / yarn が必要ならnode.jsのbuildpackを追加する必要があることを知っておこう
buildpack とは
- buildpack | Heroku Dev Center
上記ドキュメントにもありますが、
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 を追加で認識させてやらないとダメなんですね。
やり方はここに書いてあります
- アプリの複数の buildpack の使用 | Heroku Dev Center
ただ、上記ドキュメントにもあるように Ruby on Rails アプリの場合は
buildpack の最後が Ruby buildpack でないと Ruby の Dynoコンテナとして立ち上がらないようなので、下記のように追加してやる必要があります。
# heroku リモートリポジトリを追加したディレクトリ配下で以下を実行
$ heroku buildpacks:add --index 1 heroku/nodejs
# 追加できているか確認
$ heroku buildpacks
- Rails 5.1 アプリを Heroku にデプロイする | ボクココ
これでOKです。
default では devDependencies の依存関係はビルドステップ完了後に削除される
- Heroku の Node.js サポート | Heroku Dev Center
パッケージのインストール
デフォルトでは、Heroku は package.json の dependencies および devDependencies に記載されているすべての依存関係をインストールします。
インストールおよびビルドステップを実行した後、 Heroku はアプリケーションをデプロイする前に、devDependencies に宣言されているパッケージを取り除きます。
もしビルドステップが完了した後も devDependencies の依存関係を残したい場合、
以下のconfigを設定しておく必要があります
## npm を使っている場合
heroku config:set NPM_CONFIG_PRODUCTION=false
## yarn を使っている場合
heroku config:set YARN_PRODUCTION=false
- node.js | Error in deploying on heroku, /bin/sh: 1: webpack: not found | Stack Overflow
- webpack | Hosting a production React app built with Wepback on Heroku | Stack Overflow
- Dockerfile解説編。Docker環境のNuxt.jsをHerokuにデプロイする(1/2) | 独学プログラマ
heroku yarn run で何でもできるわけじゃない
heroku は Dynoコンテナが再起動するので、tmp/
配下にしかファイルを出力できないようです
(tmp/
配下も再起動時には削除される)
# ファイルを出力するような node.js スクリプトは失敗する
heroku yarn run hogehoge.js
- Heroku上のNode.js Expressでファイルアップロードを実装したときのError: ENOENT: no such file or directory | Qiita
- herokuで一時ファイルを使用する場合 | Qiita
(未検証)ビルドプロセスに入れればファイル出力もできる……?
この記事を書いてる途中で気づいたのですが、
heroku は node.js のビルドプロセスとして build
や start
コマンドを実行するようなので、この中に入れておけば tmp/
配下以外へのファイル出力も実行してくれるのかも……?
"scripts": {
"start": "node index.js",
"build": "webpack",
"heroku-prebuild": "echo This runs before Heroku installs your dependencies.",
"heroku-postbuild": "echo This runs afterwards."
}
- Heroku の Node.js サポート | Heroku Dev Center
- Node.js のデプロイのトラブルシューティング | Heroku Dev Center
知っている人がいれば情報くれると嬉しいです。私も時間を見つけて検証したらここに追記します。
今回はここまでです。じゃ!
Discussion