Node.js のプロジェクトで pnpm をパッケージマネージャーとして使っているのですが、エージェントが勝手に npm を使ってしまうことがあります。これを防ぐために、pnpm を強制する仕込みを入れます。
1. npm_config_yes と only-allow を使う
only-allow を preinstall フックに仕込むことで、指定したパッケージマネージャー以外での実行をエラーにして中断させます。
設定手順
only-allowdevDependenciesに追加package.jsonにpreinstallスクリプトを追加
{
"scripts": {
"preinstall": "npx only-allow pnpm"
}
}
この設定があると、誰かが npm install や yarn install を叩いた瞬間にエラーメッセージが表示され、インストールが強制終了されます。
2. .npmrc でエンジンを制限する
プロジェクトのルートにある .npmrc ファイルに以下の設定を書き込むことで、特定のパッケージマネージャーの使用を促すことができます。
engine-strict = true
次に、package.json の engines フィールドに使用を許可する pnpm のバージョンを指定します。
{
"engines": {
"pnpm": ">=8.0.0",
"npm": "please_use_pnpm_instead"
}
}
[!IMPORTANT] この方法は、環境によっては警告だけで済んでしまう場合があるため、方法1(only-allow) と併用するのが最も確実です。
3. Corepack を有効にする
Node.js 16.9.0 以降には、パッケージマネージャーのバージョンを管理する Corepack が同梱されています。これを使うと、プロジェクトで指定されたマネージャー以外を使おうとしたときにエラーを出してくれます。ただし、開発者が自分の PC で有効化し忘れていると、普通に npm install が通ってしまうため、あくまで補助的な役割になりそうです。
設定手順
- Corepack を有効化(OSのターミナルで実行)
corepack enable
package.jsonでマネージャーを指定
{
"packageManager": "pnpm@9.0.0"
}
これにより、npm install を実行しようとすると「このプロジェクトは pnpm を使うように設定されています」といった旨のエラーが出るようになります。
おわりに
これでエージェントだけでなく開発者にとっても pnpm 以外のパッケージマネージャーが間違って使われることを防ぐことができました。