Volta, asdf, nodenv などメンバーの node.js のバージョン管理ツールが異なる状況 + GitHub actions で実行される node.js のバージョンもいい感じに揃えたい
1. node のバージョンが指定と異なる時に npm install を制限する
engine-strict=true
を使って package.json の engines
に指定されたバージョン以外だと npm install 時にエラーが出るようにする
.npmrc
engine-strict=true
package.json
{ "engines": { // node のバージョンを v18.13.0 以上 v19 未満に固定 "node": "^18.13.0" } }
2. プロジェクト内の node.js のバージョンを固定する
2-1. .node-version
ファイルを作成
多くの node.js バージョン管理ツールで採用されている .node-version
でバージョン固定する
.node-version
18.13.0
.node-version
の書き方や有効なツールは node-version-usage を参照
2-2. Volta の設定を追加
Volta は package.json
に独自フィールドを持たせることで自動的に node のバージョンが切り替わるようになる
ただ node.js のバージョンを変更するたびに package.json
に変更が入るのは微妙なので、別ファイルで管理できるようにした
.volta.json
{ "volta": { "node": "18.13.0" } }
package.json
{ "volita": { "extends": "./.volta.json" } }
3. GitHub actions で使用する Node.js のバージョンを .node-version
で指定する
setup-node
内で node-version-file
に .node-version
を指定すると、.node-version
に書かれているバージョンが使用されるようになる
name: PR test on: pull_request: branches: - main jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version-file: ./.node-version # ← これを追加 cache: npm cache-dependency-path: ./package-lock.json - name: Install packages run: npm ci - name: Run test run: npm run test
問題
- package.json の
engines
フィールドはパッケージがサポートする node のバージョンなので、それを開発者の環境を縛るためにも利用するのはチョットやりすぎな気がする- テストやビルドしている CI で node のバージョンを指定しているならパッケージが想定している node のバージョンがあるということだと思うので、このバージョンを
engines
に指定してしまって副次的に開発者の node のバージョンを縛るというのは悪くない気がしている
- テストやビルドしている CI で node のバージョンを指定しているならパッケージが想定している node のバージョンがあるということだと思うので、このバージョンを
- volta,
.node-version
は^18.13.0
や~18
のような幅を持たせたバージョンの指定ができないので若干微妙 - いろんなツールで有効な
.node-version
の書き方で、GitHub actions のバージョン指定にも.node-version
を使う場合、18
として v18 の最新版を使うようなことができなくなってしまう (.node-version
に18
と書いても認識できないツールが多い) - yarn を使っている場合 volta は設定で yarn のバージョンは固定できるが、それ以外のツールだとバージョンを固定することが難しそう (
package.json
のengines
で固定可能? )
所感
volta の設定・.node-version
でガッツリバージョン指定してしまう代わりにプロジェクトに入ると自動的に node のバージョンが切り替わるようにするか、engines
と engine-strict=true
とでバージョンに幅を持たせる代わりに npm install でエラーになったら開発者が自分で node のバーションを切り替えるようにするか。なのかなと思いました。
また多くのツールで有効な .node-version
の書き方が 18.18.0
のような形なので、これを GitHub Actions でも使うのはガッツリバージョンが固定されてしまうので、個人的には strategy
で lts/*
含めてバージョン指定してしまう方が良さそうかな〜という気がしています
みんなはどうしてるのでしょうか?
良いアイディアがあれば教えてください!
[参考]