見出し画像

package.jsonでのバージョン指定方法について

結論から先に言うと、こういう書き方をするに至ってます。

"@types/selenium-webdriver": ">=4.0.16 <4.2.0",
"selenium-webdriver": ">=4.1.0 <4.2.0",
"geckodriver": ">=2.0.4 <2.1.0",
"ms-chromium-edge-driver": ">=0.4.3 <0.5.0",

要するに、パッチバージョン(右端の3つ目のバージョン)のみ自由っていうことです。この書き方のメリットやらなんやらをつらつら書いていきます。

メリット その1

これ以外に、チルダ「~」を使ってもほぼ同じですが、上の書き方のほうが、誰が見ても、一目で分かる、とは思います。

メリット その2

パッチバージョンのみ自由にしておけば、package-lock.jsonを削除して、npm installをすれば、パッチバージョンのみ最新化することができます。

パッチバージョンはバグ修正のバージョンであることがほとんどで、機能の追加や変更はなく、基本的に入れたほうがいいやつです。それが手軽にできるようになる、ということです。

とは言え、動確が面倒なので、パッチバージョンのみのバージョンUPはあんまりやらないですけどね。一応、選択肢として持っておく、という感じです。

メリット その3

パッチバージョンのみ自由にしておけば、package-lock.jsonを削除して、npm installをすれば、ごみみたいに残ってる要らない依存関係をlockファイルから消せます。マイナーバージョンも自由にしてた場合、結構変わっちゃって、ごみが消えたのか、何なのか判別が付かなくなります。

メリット その4

パッチバージョンのみ自由にしておけば、依存関係にある他のモジュールが、パッチバージョンが違うだけの同じモジュールを必要としてる際に、それぞれ別途入れられてしまう事態を回避できると思います(たぶん)。パッチバージョンの違いだったら、ほぼ同じなので、その程度であれば、バージョンを揃えたいですからね。

メリット その5

TypeScript用の型宣言のモジュールが別に存在するケースで、本体モジュールと型宣言のモジュールでバージョンの上限を揃えられる、というのがあります。

"@types/selenium-webdriver": ">=4.0.16 <4.2.0",
"selenium-webdriver": ">=4.1.0 <4.2.0",

先ほどの例だと、selenium-webdriverの最新は現在4.1.0です。しかし、型宣言のモジュールのほうは、4.0.16までしか出てません。4.1.0では特に関数の宣言部分は変わってないのかもしれませんし、もしくは、単にリリースが遅れているだけなのかもしれません。分かりません。その場合でも、型宣言のモジュールについて新し過ぎるものを取らないよう、ペースを揃えるのに、
この書き方は便利です。上の例だと「4.2.0以上は進み過ぎだし、4.1.xがあるのであれば、それを取っても良い」ということを示しています。

package-lock.jsonをいったん削除する際の注意点

lockファイルを削除してから、npm installで再度生成すると、Windows環境でも改行コードが¥n(=LF)になります。私の仕事環境だと、Gitリポジトリの中では常に¥n(=LF)、checkoutすると、Windows環境では¥r¥n(=CRLF)になるようにしていますから(auto-crlf)、¥n(=LF)になってしまうと、diffツール(私はSourceTreeに付属でdiffでざっと見てます)がそれだけで差分と認識してしまいます。というわけで、エディタなどで別途¥r¥n(=CRLF)に置換しておく必要があります。Gitにコミットすれば、auto-crlfで、¥n(=LF)に読み替えられますから問題なしです。

要注意なやつ その1

一方、チルダ「~」と似てますが、ハット「^」を使う書き方は要注意だと思います。これは、左側のバージョンに0がある時の挙動に注意です。「左から見ていって、最初に0でないバージョン」は上げない、という意味だそうです。だから、「^2.0.4」だと、2.9.9とかまでは上がることになる一方で、「^0.4.3」だと0.5.0には上がらず、上がるのは0.4.9とかまでぐらいになるということです。後者ならいいですが、前者だと、結構変わってしまうおそれがありますので、慎重に行きたいです。

要注意なやつ その2

さらに「2.0.x」みたいな書き方もありますが、これだと、「2.0.4以上」であることは示せず、2.0.0でも可になってしまうので、また、ちょっと違います。

おわりに

「なんで、おれ、この書き方始めたんだっけ?」ってなったので、ここまでに至った経緯をまとめておきました。

参考サイト
https://qiita.com/sotarok/items/4ebd4cfedab186355867


この記事が気に入ったらサポートをしてみませんか?