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/* 含めてバージョン指定してしまう方が良さそうかな〜という気がしています
みんなはどうしてるのでしょうか?
良いアイディアがあれば教えてください!
[参考]


