JavaScript
Node.js
npm

そのプロジェクト、npmのバージョン固定できてる?


思い込み

「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を指定すれば良いようです。🍻


解決


package.json

"engines": {

"node": "8.11.1",
"npm": "5.6.0"
},

.npmrc


.npmrc

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