pnpm-lock.yamlをPrettierから外す責務分担を調べる

pnpm-lock.yamlをPrettierの対象から外すかどうかは、YAMLを整形したいかではなく、どのツールを生成元とするかで決めます。
pnpmは依存関係の解決結果をlockfileへ書きます。
Prettierは人が管理するソースを整形します。
Dependabotは依存関係更新の差分を作ります。
CIは固定された環境でlockfileからインストールできるかを検証します。
この責務を混ぜると、手動更新は通るのにbotのPRだけformat checkで失敗する状態が起こります。
まず各ファイルの正本を決める
| 対象 | 主な責務 |
|---|---|
package.json |
人が管理する依存宣言とscript |
pnpm-lock.yaml |
pnpmが生成する解決結果 |
.prettierignore |
Prettierの入力から外すファイル |
.gitignore |
Gitで追跡しないローカルファイル |
| Dependabot設定 | 更新の頻度と対象範囲 |
| CI | installの再現性とコード品質 |
lockfileはアプリケーションの依存関係を再現するため、通常はGitへコミットします。
.gitignoreから外すのではなく、Prettierだけの対象外にするため.prettierignoreを使います。
Prettierのignoreガイドでは、gitignore形式で除外パターンを書きます。
推奨する最小設定
# .prettierignore
pnpm-lock.yaml
pnpmのバージョンはpackageManagerフィールドやCIのセットアップで固定します。
lockfileを生成したpnpmと、検証に使うpnpmの世代を合わせます。
CIでは、次の順番で責務を分けます。
- run: corepack enable
- run: pnpm install --frozen-lockfile
- run: pnpm exec prettier . --check
- run: pnpm run lint
- run: pnpm run build
このリポジトリにtest scriptがある場合は、プロジェクト固有のテストもbuild前後へ追加します。
pnpm install --frozen-lockfileは、lockfile更新が必要な状態でCIを失敗させます。
これにより、package.jsonとlockfileの不一致をformat checkとは別に検出できます。
Dependabotではpnpmをnpm ecosystemとして扱う
GitHub Dependabotの設定では、pnpmもpackage-ecosystem: "npm"へ指定します。
最小の例は次です。
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
versioning-strategy: "lockfile-only"
対応ecosystemとDependabot optionsで、利用中の設定を確認します。
直接依存も更新したいなら、lockfile-onlyを選んだ理由を見直します。
monorepoでは、各packageのdirectory、lockfileの場所、CIのworking directoryを一致させます。
botのPRだけ失敗するときの切り分け
次の順番で確認します。
- ローカルとCIのpnpmバージョンが同じか
packageManagerがpackage.jsonへ固定されているか- Dependabotのdirectoryがlockfileの場所を指しているか
- Prettierがlockfileを変更していないか
pnpm install --frozen-lockfileが先に成功するかpostinstallが環境依存になっていないか
DependabotのPRブランチをローカルへ取得したら、まずfrozen installを実行します。
その後にformat checkを行い、依存解決と整形のどちらで失敗したかを分けます。
lockfileも整形する場合
チームがlockfileをPrettierの対象へ含めるなら、手動更新、Dependabot、CIのすべてで同じPrettierバージョンと設定を使います。
人のPRだけ整形し、botのPRへ適用しない運用は差分を不安定にします。
ただし、lockfileの可読性を上げる利点は限定的です。
生成ツールの固定、不要な差分の抑制、再現可能なinstallを優先する方が、障害の原因を追いやすいです。
まとめ
lockfileをYAMLだから整形するのではなく、pnpmを唯一の生成元として扱います。
Prettierからは外し、CIでは固定したpnpmで--frozen-lockfileを実行します。
Dependabotも同じlockfileを更新する経路として扱います。
この責務分担により、手動更新とbot更新を同じ再現性の基準で検証できます。
