思い込み
「nodeとnpmのバージョン固定とかなにを今更…(苦笑)
ndenvでnodeを固定しとけば、npmもできてんでしょ」
…って思ってた時期が僕にもありました。。
※下部に追記有り
問題
$ cat .node-version
v8.11.1
$ which npm
/Users/username/.anyenv/envs/ndenv/shims/npm
$ npm -v
5.6.0
$ npm i -g npm@6.0.1
$ npm -v
6.0.1
$ which npm
/Users/username/.anyenv/envs/ndenv/shims/npm
😇 …こんな感じでカンタンに書き換えが可能です。
チームで開発してたら大問題ですね⤵️
「…でも、どうやってnpmを固定するんだろう??」
と悩んでいたら、同僚に教えてもらいました。
要は、engineを指定すれば良いようです。🍻
解決
"engines": {
"node": "8.11.1",
"npm": "5.6.0"
},
engine-strict=true
こうしておくことで、 $ npm i
の際にengineを確認して、バージョンの問題があった場合はインストールさせないようです🎉️
周知は必要ですが、npmのバージョン固定という目的は解決できそうです!
ちなみに自分は、anyenv(=>ndenv)を使ってnodeのversion固定しています。今回の記事にあまり関係無いですが、env系とかを複数使ってる人には便利なのでオススメです。
[追記]つづき
UPDATE: 2018/06/01
「npm固定できたから、やっと思い通り動くわー」
と思ってたのも束の間…
brewでherokuコマンド更新したら、ご丁寧にnpmまでインストールしてくださいました😇
そしてそのnpmは↑でバージョンを固定できない悪魔的な挙動で詰んだ。。
…で、悩んでて思いついたんだけど、 npx
ならどのバージョンつかってもnpmを固定できるんじゃないか?と考えて試したらいけた。
$ which npm
/usr/local/bin/npm
$ npx which npm
/Users/username/.anyenv/envs/ndenv/shims/npm
$ npx npm run hoge // ←これだと、ndenvで設定したnpmで起動できる。
UPDATE: 2018/06/20
brewを使ってる場合は、PATHをbrewよりもndenvの方を優先しておく。
参考: https://qiita.com/n-oshiro/items/3c571a4fcdb023b1fe77