マトリョーシカ的日常

ワクワクばらまく明日のブログ。

久しぶりに改修したRailsアプリでnode-sassのビルドエラーを解消した

はじめに

ずっと前に開発したWebサービスがある。lytnoteといって、目標設定機能のついた日報アプリだ。デプロイにrender.comを利用しているが、月に1,000円ほど月額料金がかかっている。サービスを永続的なものにしたいので、運営コストはなるべく安いものにしたい。

lytnote.com

そういうわけでfly.ioへ移行することとした。しかし移行する前にひさしぶりにアプリをローカルで立ち上げようとするもエラーが発生する。どうやらupdateが必要なgemがあったり、依存性の問題があるようだ。

これを解消しよう。

AIと共に生きる

もうAIと共に生きることにしたのでGithub Copilotの年間プランに入会した。VScodeに彼を入れることで、現在のソースコードを読み取ってくれて、こちらからの質問にもうまく対応してくれる。ChatGPTだと自分がコードを貼り付けて質問する必要があるが、情報量が足りずに齟齬が起きる場合があった。

発生したエラー

ターミナルでrails s と実行するとエラーが発生した。

/Users/xxx/lytnote/node_modules/node-sass: Command failed.
Exit code: 1
Command: node scripts/build.js
Arguments:
Directory: /Users/kondoukou/lytnote/node_modules/node-sass
Output:
Building: /Users/xxx/.nvm/versions/node/v18.1.0/bin/node /Users/kondoukou/lytnote/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
gyp info it worked if it ends with ok

node-sassNode.js に問題があるようだ。

node-sassとはなにか

node-sass - npm

Node-sass is a library that provides binding for Node.js to LibSass, the C version of the popular stylesheet preprocessor, Sass. It allows you to natively compile .scss files to css at incredible speed and automatically via a connect middleware.

node-sassとはWebpackerのバージョン4で使用されているライブラリである。SassをCSSに変換する際に使われている。しかし、ライブラリのベースとされているLibSassの開発が停止となり、node-sass自体も現在は非推奨である。そのため、Node.jsのバージョンを上げると不具合が起こる。

WebpackerとRails

Rails 6では、JavaScriptやCSS、画像などのフロントエンド関係の要素を管理しやすくするため、Webpackerという仕組みが導入されている。WebpackerはJavaScriptモジュールバンドラーであるWebpackのラッパーライブラリである。Railsの皮を着せたwebpackだ。

Rails7以降ではWebpackerは廃止されたため、エラーを回避するためにRails7にアップグレードするという選択肢もあった。しかし、これはこれで変更箇所が多すぎるので今回は見送った。

修正箇所

バージョンの不整合を避けるため、以下のように修正した。

Gemfile

- gem 'webpacker', '~> 4.0'
+ gem 'webpacker', '~> 5.4', '>= 5.4.4'

package.json

-    "@rails/webpacker": "4.3.0",
+   "@rails/webpacker": "^5.4.4",

Gemfilepackage.json の両方ともバージョンを書き換える。

そうして

bundle install 
yarn install

を実行した。無事にエラーは解消された。

おわりに

技術的負債は久々に触ると手間がかかるが、CopilotやChatGPTのようなツールがあると、心理的なハードルがかなり下がる。

また続きを書く。

UnsplashTroy Olson