22

谈 DevOps 平台落地:前端项目构建又失败了

 4 years ago
source link: https://showme.codes/2019-11-20/devops-platform-front-dependency-manage-error/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

aaM7Bfm.png!web

同事发了一个前端构建失败的链接过来,接着就是那句:任务执行失败了,麻烦帮忙看看。

DevOps 平台的“老手”了,所以,在找我们解决问题时,都知道附上平台任务的链接。

我们打开链接,第一件事情就是看日志。是的,DevOps 平台的使用者很多都认为:在本地执行构建成功,那么在平台上构建失败就是平台的问题。所以部分人连构建日志都不看,直接把链接发给我们这些平台维护者看。

不出意外,这次又是依赖管理问题。只不过,这次是发生在前端项目上。错误截图下如下:

riEB7rj.png!web

日志里(画红线部分)已经说得很清楚了。虽然我不清楚“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"
  },
...
}

我们看到依赖的版本号的前缀有 ~ ,有也 ^ 。这是什么意思呢?

~
^

也就是说,每次执行 npm install ,该项目所依赖的内容,都是有可能变的。

这对我来说是不可思议的。为什么?

因为依赖的版本代表着一个软件的基础。依赖的版本在你不知道的情况下发生变更,就好比建房子,建第一层时,地基是100个平方,建第二层时,地基突然就变成了90个平方。而前端项目中大量这种情况。

你可能会说开源前端node项目都会遵循语义化的版本号,小版本升级不会出问题的。我想说,那只是约定,还是要看那个人遵守不遵守。如果你真相信每个人都遵守,本质上是把软件开发风险的控制权交给了开源软件作者的个人习惯。开发出来的软件注定是不稳定的。

但是,为什么前端项目的依赖的版本号前普遍会加上 ~^ 。在我亲自执行 npm install express 命令时,我知道了原因。因为在执行命令后, package.json 文件中就出现了: "express": "^4.16.0" 。也是 npm 在安装依赖时,默认就给版本号加上 ^ 前缀。而很多人可能改都不会去改。这就导致了文章开头所说的那位同事的问题。

后记

真心希望大家固定下 package.json 中的依赖的版本号。这样的前端项目构建起来才有稳定的基础。

同时,我们的 DevOps 平台在设计时,是不是可以考虑增加这么一个功能:自动检测项目有没有固定依赖的版本号,如果没有固定,就告警。

我把这个功能叫做:依赖版本号不稳定预警。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK