本文へ移動
Signalcraft
English

← Signalcraft一覧へ戻る

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

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"

対応ecosystemDependabot optionsで、利用中の設定を確認します。

直接依存も更新したいなら、lockfile-onlyを選んだ理由を見直します。

monorepoでは、各packageのdirectory、lockfileの場所、CIのworking directoryを一致させます。

botのPRだけ失敗するときの切り分け

次の順番で確認します。

  1. ローカルとCIのpnpmバージョンが同じか
  2. packageManagerpackage.jsonへ固定されているか
  3. Dependabotのdirectoryがlockfileの場所を指しているか
  4. Prettierがlockfileを変更していないか
  5. pnpm install --frozen-lockfileが先に成功するか
  6. 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更新を同じ再現性の基準で検証できます。

参考資料