【npm】npm installできないようにする【yarn】【pnpm】

## はじめに
本記事はプログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。  
そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。  
間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。  
また、以下の記事の一環として記載しますが、yarnやpnpmを使用する際に`npm install`を不可にする方法はDockerを使用しない場合でも同様です。

https://qiita.com/P-man_Brown/items/db1996bdee33ee667741

https://qiita.com/P-man_Brown/items/c2a69d943853cb381fbe

https://qiita.com/P-man_Brown/items/5a82ad98cb96206343b9

https://qiita.com/P-man_Brown/items/77b31fed33cc59f43ace

## `npm install`を使用不可にする
`npm install`を使用不可にする方法はいくつかあります。
以下`yarn`を使用する前提で記述します。

### `only-allow`を使用する
[only-allow](https://www.npmjs.com/package/only-allow)を使用することで`yarn`の使用を強制できます。  
使用するには`package.json`に以下のとおり追記します。

```package.json
{
  "scripts": {
    "preinstall": "npx -y only-allow yarn"
  }
}
```

npxに`-y`をつけていますが、つけている理由については以下をご参照ください。

https://qiita.com/P-man_Brown/items/6210e7c6a28a36e516d0



しかし、`only-allow`は`npm install`では以下のようなエラーが出るものの、`npm install <package>`ではエラーが出ませんでした。

これは、GitHubのissueでも言及されています。

https://github.com/pnpm/only-allow/issues/1

```:ターミナル
$ npm install

> myapp-front@0.1.0 preinstall
> npx -y only-allow yarn

╔═════════════════════════════════════════════════════════════╗
║                                                             ║
║   Use "yarn" for installation in this project.              ║
║                                                             ║
║   If you don't have Yarn, install it via "npm i -g yarn".   ║
║   For more details, go to https://yarnpkg.com/              ║
║                                                             ║
╚═════════════════════════════════════════════════════════════╝
npm ERR! code 1
npm ERR! path /Users/user_name/Documents/sources/docker-next-test/Next
npm ERR! command failed
npm ERR! command sh -c  npx -y only-allow yarn

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/user_name/.npm/_logs/2022-04-28T14_44_01_788Z-debug-0.log
```

```:ターミナル
$  npm install uuid

added 1 package, and audited 234 packages in 575ms

67 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```

`npm install <package>`でもエラーが出るようにしたいです。
`only-allow`はpnpmなども使用不可にできる点で優れていますが、他の方法でnpmのみ使用不可にします。

### `.npmrc`を作成する
まず、`package.json`に以下を追記します。
```package.json
{

  "engines": {
    "npm": "npmではなくyarnを使用してください"
  },

}
```

次に、`.npmrc`を作成します。
```.npmrc
engine-strict=true
```

これで、npmを使用するとエラーが出るようになります。

```:ターミナル
$ npm install
npm ERR! code EBADENGINE
npm ERR! engine Unsupported engine
npm ERR! engine Not compatible with your version of node/npm: myapp-front@0.1.0
npm ERR! notsup Not compatible with your version of node/npm: myapp-front@0.1.0
npm ERR! notsup Required: {"npm":"npmではなくyarnを使用してください"}
npm ERR! notsup Actual:   {"npm":"8.3.1","node":"v16.14.0"}

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/user_name/.npm/_logs/2022-04-28T18_14_01_861Z-debug-0.log
```
```:ターミナル
$ npm install <package>
npm ERR! code EBADENGINE
npm ERR! engine Unsupported engine
npm ERR! engine Not compatible with your version of node/npm: myapp-front@0.1.0
npm ERR! notsup Not compatible with your version of node/npm: myapp-front@0.1.0
npm ERR! notsup Required: {"npm":"npmではなくyarnを使用してください"}
npm ERR! notsup Actual:   {"npm":"8.3.1","node":"v16.14.0"}

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/user_name/.npm/_logs/2022-04-28T16_47_26_621Z-debug-0.log
```
`.npmrc`によってnpmを使用した際に`--engine-strict`オプションが付くようになります。
すると`package.json`で指定したnpmのバージョン以外は使用不可になります。
本来npmのバージョンを記述する箇所に「npmではなくyarnを使用してください」と記述しているため必ずエラーとなります。
この「npmではなくyarnを使用してください」の箇所はnpmのバージョンに存在しないものであれば何でも構いません。


### Corepackを利用する
yarnの使用を強制するためにCorepackを利用する手段もあります。
以下をご参照ください。

https://qiita.com/P-man_Brown/items/a75a042813f9a20768fd