結論
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系を使うことにする。
やり方については別の記事として書いた