rails で Webpacker::Manifest::MissingEntryError エラー

結論

node のバージョンが違った。同じDockerfile でビルドしているので同じバージョンと思い込んでいた。

経緯

いろいろ調べてもなかなかすぐに解決しなかったので、整理もかねて、メモしていく

あるPCでrails アプリを開発していて、そのアプリを別のPCで起動しようとしたときに起きたエラー。

いわれたことを見てみる

ありがたいことに

Webpacker can't find application.js in /usr/local/src/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:

などと対策が書いてくれているが、それぞれ問題があったところで困った。

なお、言われている通り、public/packs/manifest.json はgit管理下になく、最初のビルドで作成されることを期待していたが、どうも作られなかった模様。

1 compileの設定

これはtrueになっていた。

2 まだ反映されてない

時間もたっているし、何度か立ち上げなおしているので、これも違うだろう

3 config/webpacker.yml の設定ミス

ファイル自体をいじってないのでミスはないと信じたい。

それぞれの設定がどういうものかは理解できていないので、ここが原因だと詰む

一応さらっと見てみたが、ミスっぽいのはないように感じた

4 Your webpack configuration is not creating a manifest.

いわずもがなこれ。

ググってみる

エラーメッセージでググると、

rails webpacker:install
rails webpacker:compile

を行う必要ありとの主張が多い。自動生成されていたファイルがないのだから、ビルドなりコンパイルをする必要があるのはうなずける

やってみる

dc exec web bundle ex rails webpacker:install 

dc は docker-composeのalias。installは無事完了

 dc exec web bundle ex rails webpacker:compile                                              Compiling...                                                                                                            Compilation failed:                                                                                                     node:internal/crypto/hash:67                                                                                              this[kHandle] = new _Hash(algorithm, xofLen);                                                                                           ^                                                                                                                                                                                                                             Error: error:0308010C:digital envelope routines::unsupported                                                                at new Hash (node:internal/crypto/hash:67:19)                                                                           at Object.createHash (node:crypto:130:10)                                                                               at module.exports (/usr/local/src/node_modules/webpack/lib/util/createHash.js:135:53)                                   at NormalModule._initBuildHash (/usr/local/src/node_modules/webpack/lib/NormalModule.js:417:16)                         at handleParseError (/usr/local/src/node_modules/webpack/lib/NormalModule.js:471:10)                                    at /usr/local/src/node_modules/webpack/lib/NormalModule.js:503:5                                                        at /usr/local/src/node_modules/webpack/lib/NormalModule.js:358:12                                                       at /usr/local/src/node_modules/loader-runner/lib/LoaderRunner.js:373:3                                                  at iterateNormalLoaders (/usr/local/src/node_modules/loader-runner/lib/LoaderRunner.js:214:10)                          at iterateNormalLoaders (/usr/local/src/node_modules/loader-runner/lib/LoaderRunner.js:221:10)                          at /usr/local/src/node_modules/loader-runner/lib/LoaderRunner.js:236:3                                                  at context.callback (/usr/local/src/node_modules/loader-runner/lib/LoaderRunner.js:111:13)                              at /usr/local/src/node_modules/babel-loader/lib/index.js:59:71                                                          at processTicksAndRejections (node:internal/process/task_queues:96:5) {                                               opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],                                library: 'digital envelope routines',                                                                                   reason: 'unsupported',                                                                                                  code: 'ERR_OSSL_EVP_UNSUPPORTED'

ハイライトがないとわかりずらいが、 Error: error:0308010C:digital envelope routines::unsupported というエラーが出ている。

Error: error:0308010C:digital envelope routines::unsupported

このエラー、調べると、node.js のバージョンの問題だという主張がほとんど。

node.js のバージョンを下げれば解決するらしいが、それはやりたくない。

そもそも元のPCでは元気に動いてるんだから、nodeのバージョンを下げなければいけないはずはない

webpacker のバージョンが悪いかもという記事も見つけたが、これも根本原因は違うだろう。

webpacker:compileを実行すること自体が違うのでは?という仮説を立てて進める

ちなみに今回は Hello Railsまでは表示できている。

そもそも manifest.json とは何で、どこで作成されるのか

アプリを始める段階で、手動でmanifest.jsonを作成したことはない。

名称的にはフロントに関する何かをビルドするときに自動で作成されたものと思われる

おそらくは rails new によるものではないかなと思う

しばらく調べたがやはりわからない。

nodeのバージョンが違った

webpacker が動作しないのはどうもおかしいと思い、元のPCで webpacker:compile や webpacker-dev-server などを使っても、問題なく、動作する。

そこで思い立って、nodeのバージョンを確認してみた。

元のPCでは14.19.1で、動かなかったPCでは16.14.2 となっていた(違うんかーい)

同じDockerfile でビルドしているのでバージョンが同じとばかり思いこんでいたが、落とし穴だった。

Dockerfileの書き方を修正して、14系を使うことにする。

やり方については別の記事として書いた

timtoronto634.hatenablog.com