かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

続・フロントエンド開発環境: チーム開発するリポジトリで node のバージョンを揃えたい

Volta, asdf, nodenv などメンバーの node.js のバージョン管理ツールが異なる状況 + GitHub actions で実行される node.js のバージョンもいい感じに揃えたい

1. node のバージョンが指定と異なる時に npm install を制限する

engine-strict=true を使って package.jsonengines に指定されたバージョン以外だと 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.jsonengines フィールドはパッケージがサポートする node のバージョンなので、それを開発者の環境を縛るためにも利用するのはチョットやりすぎな気がする
    • テストやビルドしている CI で node のバージョンを指定しているならパッケージが想定している node のバージョンがあるということだと思うので、このバージョンを engines に指定してしまって副次的に開発者の node のバージョンを縛るというのは悪くない気がしている
  • volta, .node-version^18.13.0~18 のような幅を持たせたバージョンの指定ができないので若干微妙
  • いろんなツールで有効な .node-version の書き方で、GitHub actions のバージョン指定にも .node-version を使う場合、18 として v18 の最新版を使うようなことができなくなってしまう (.node-version18 と書いても認識できないツールが多い)
  • yarn を使っている場合 volta は設定で yarn のバージョンは固定できるが、それ以外のツールだとバージョンを固定することが難しそう (package.jsonengines で固定可能? )

所感

volta の設定・.node-version でガッツリバージョン指定してしまう代わりにプロジェクトに入ると自動的に node のバージョンが切り替わるようにするか、enginesengine-strict=true とでバージョンに幅を持たせる代わりに npm install でエラーになったら開発者が自分で node のバーションを切り替えるようにするか。なのかなと思いました。
また多くのツールで有効な .node-version の書き方が 18.18.0 のような形なので、これを GitHub Actions でも使うのはガッツリバージョンが固定されてしまうので、個人的には strategylts/* 含めてバージョン指定してしまう方が良さそうかな〜という気がしています

みんなはどうしてるのでしょうか?
良いアイディアがあれば教えてください!


[参考]