同事发了一个前端构建失败的链接过来,接着就是那句:任务执行失败了,麻烦帮忙看看。
DevOps 平台的“老手”了,所以,在找我们解决问题时,都知道附上平台任务的链接。
我们打开链接,第一件事情就是看日志。是的,DevOps 平台的使用者很多都认为:在本地执行构建成功,那么在平台上构建失败就是平台的问题。所以部分人连构建日志都不看,直接把链接发给我们这些平台维护者看。
不出意外,这次又是依赖管理问题。只不过,这次是发生在前端项目上。错误截图下如下:
image.png日志里(画红线部分)已经说得很清楚了。虽然我不清楚“Tristan”是什么,但是可以猜到是他的业务代码报这样的错。但是他本地执行没报错,那通常就是依赖的版本的问题了。
他的前端的依赖定义(package.json)类似以下这样:
{
.....
"dependencies": {
"cookie-parser": "^1.4.3",
"debug": "~2.6.9",
"express": "^4.16.0",
"http-errors": "^1.6.2",
"morgan": "~1.9.0",
"pug": "2.0.0-beta11"
},
...
}
我们看到依赖的版本号的前缀有 ~
,有也 ^
。这是什么意思呢?
-
~
: 前缀表示,安装大于指定的这个版本,并且匹配到 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/
网友评论