我们看到依赖的版本号的前缀有 ~
,有也 ^
。这是什么意思呢?
-
~
: 前缀表示,安装大于指定的这个版本,并且匹配到 x.y.z 中 z 最新的版本。 -
^
: 前缀在 ^0.y.z 时的表现和 ~0.y.z 是一样的,然而 ^1.y.z 的时候,就会 匹配到 y 和 z 都是最新的版本。
也就是说,每次执行 npm install ,该项目所依赖的内容,都是有可能变的。
这对我来说是不可思议的。为什么?
因为依赖的版本代表着一个软件的基础。依赖的版本在你不知道的情况下发生变更,就好比建房子,建第一层时,地基是100个平方,建第二层时,地基突然就变成了90个平方。而前端项目中大量这种情况。
你可能会说开源前端node项目都会遵循语义化的版本号,小版本升级不会出问题的。我想说,那只是约定,还是要看那个人遵守不遵守。如果你真相信每个人都遵守,本质上是把软件开发风险的控制权交给了开源软件作者的个人习惯。开发出来的软件注定是不稳定的。
但是,为什么前端项目的依赖的版本号前普遍会加上 ~
和 ^
。在我亲自执行 npm install express
命令时,我知道了原因。因为在执行命令后, package.json 文件中就出现了:"express":"^4.16.0"
。也是 npm 在安装依赖时,默认就给版本号加上 ^
前缀。而很多人可能改都不会去改。这就导致了文章开头所说的那位同事的问题。
后记
真心希望大家固定下 package.json 中的依赖的版本号。这样的前端项目构建起来才有稳定的基础。
同时,我们的 DevOps 平台在设计时,是不是可以考虑增加这么一个功能:自动检测项目有没有固定依赖的版本号,如果没有固定,就告警。
我把这个功能叫做:依赖版本号不稳定预警。
封面图来自:https://pixabay.com/zh/photos/scotland-landscape-mountains-hills-1761292/
我们看到依赖的版本号的前缀有 ~
,有也 ^
。这是什么意思呢?
-
~
: 前缀表示,安装大于指定的这个版本,并且匹配到 x.y.z 中 z 最新的版本。 -
^
: 前缀在 ^0.y.z 时的表现和 ~0.y.z 是一样的,然而 ^1.y.z 的时候,就会 匹配到 y 和 z 都是最新的版本。
也就是说,每次执行 npm install ,该项目所依赖的内容,都是有可能变的。
这对我来说是不可思议的。为什么?
因为依赖的版本代表着一个软件的基础。依赖的版本在你不知道的情况下发生变更,就好比建房子,建第一层时,地基是100个平方,建第二层时,地基突然就变成了90个平方。而前端项目中大量这种情况。
你可能会说开源前端node项目都会遵循语义化的版本号,小版本升级不会出问题的。我想说,那只是约定,还是要看那个人遵守不遵守。如果你真相信每个人都遵守,本质上是把软件开发风险的控制权交给了开源软件作者的个人习惯。开发出来的软件注定是不稳定的。
但是,为什么前端项目的依赖的版本号前普遍会加上 ~
和 ^
。在我亲自执行 npm install express
命令时,我知道了原因。因为在执行命令后, package.json 文件中就出现了:"express":"^4.16.0"
。也是 npm 在安装依赖时,默认就给版本号加上 ^
前缀。而很多人可能改都不会去改。这就导致了文章开头所说的那位同事的问题。
后记
真心希望大家固定下 package.json 中的依赖的版本号。这样的前端项目构建起来才有稳定的基础。
同时,我们的 DevOps 平台在设计时,是不是可以考虑增加这么一个功能:自动检测项目有没有固定依赖的版本号,如果没有固定,就告警。
我把这个功能叫做:依赖版本号不稳定预警。
封面图来自:https://pixabay.com/zh/photos/scotland-landscape-mountains-hills-1761292/