学习在yarn审计后升级Node.js的依赖性

250 阅读2分钟

今天是星期二!来自GitHub的每周dependabot提醒的日子!一个很好的提醒,检查你的项目,通常只是点击几下的工作,自动更新是非常好的。

如果没有,快速的npm audit fix ,也许能毫无问题地进行所有的更新。哦,等等,这个项目有一个yarn.lock 文件!我应该如何处理这个问题?一个yarn audit fix ,不存在也不会发生!我应该怎么做?手动检查锁定文件?

来吧,通常yarn audit,看起来像这样。

4566 vulnerabilities found - Packages audited: 990
Severity: 1 Low | 89 Moderate | 4476 High
  Done in 4.66s.

不,有一个更好的方法。或者甚至更好的方法。请注意,我的经验涉及Yarn版本1,直到今天还在广泛使用。我没有考虑到即将到来的版本,如浆果

可能是好的,也可能是坏的#

这是最简单的方法。第1步:删除你的锁定文件和node_modules!

$ rm yarn.lock
$ rm -rf node_modules

酷。第2步。通过重新安装所有东西来创建一个新的锁文件。

$ yarn install

第3步。再检查一次!

$ yarn audit

也许这就是你所需要的一切。只是重新安装你现有的依赖关系,其中所有的临时依赖关系都更新到了最新的版本。如果这还不够好,就从长计议。

漫长的路途#

漫长的道路包括手动升级你的依赖,可以通过yarn upgrade ,也可以通过更复杂的yarn upgrade-interactive

$ yarn upgrade-interactive

后者给你一个漂亮的视图,你可以选择你想更新的软件包。还有,他们在哪个州。需要更新,但在SEMVER限制范围内,还是有可能沿途破坏一切。SEMVER和Node.js是一把双刃剑。只要人们知道SEMVER的限制和影响并坚持下去,这就很好。不过,情况可能并不总是如此。

但是,嘿,让我们沿途升级一切,看看结果如何。

23 vulnerabilities found - Packages audited: 1126
Severity: 1 Low | 10 Moderate | 12 High
  Done in 1.42s.

很好,这比早些时候少了很多......仍有一些依赖性的东西是脆弱的。审计还告诉我们哪些版本受到影响,哪些版本有补丁。

这实际上是有时让我有点难过的部分。如果你在你的依赖关系中看到几个修复问题的版本门,这有时会告诉我们,开发人员花时间做安全修复的Backport,只是为了给那些在SEMVER限制范围内的人一个使用旧版本软件包的机会。

尽管如此,我们还是无法升级。

但我们可以做的是,告诉Yarn哪个版本用于哪个深度嵌套的依赖。例如,如果我们想升级glob-parent 的所有用途,让我们在我们的resolutionpackage.json

"resolutions": {
  "**/glob-parent": "^5.1.2"
}

这里的模式告诉我们,我们要把所有的过渡性依赖关系更新到5.1.2版本。chokidar 如果我们想把例如glob-parent 的版本更新为不同的版本,我们会用chokidar/**/glob-parent 来实现。更多细节请参见选择性依赖性决议

它有帮助吗?有一点儿!

20 vulnerabilities found - Packages audited: 1122
Severity: 1 Low | 7 Moderate | 12 High
  Done in 1.50s.

现在,让我们继续处理所有其他的依赖关系,享受你的星期二吧!

捷径#

另一个解决方案是走捷径,让NPM处理审计并修复它。这是我通常做的事情。

首先,我只安装了一个package-lock.json

$ npm i --package-lock-only

没有实际的模块安装,只是概述了NPM认为需要做的事情。这可以归结为几个方面的依赖。这些是重新安装不能解决的问题,需要修复。NPM没有显示每个依赖关系的解析,而是显示有漏洞的软件包。

found 3 vulnerabilities (1 low, 2 moderate)
  run `npm audit fix` to fix them, or `npm audit` for details

audit ,为我们提供更多信息。

$ npm audit
                       === npm audit security report ===                        
                                                                                
# Run  npm install --save-dev concurrently@6.2.0  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low           │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ yargs-parser                                                 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ concurrently [dev]                                           │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ concurrently > yargs > yargs-parser                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/1500                            │
└───────────────┴──────────────────────────────────────────────────────────────┘


# Run  npm install --save-dev nodemon@2.0.9  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Regular expression denial of service                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ glob-parent                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ nodemon [dev]                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ nodemon > chokidar > glob-parent                             │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/1751                            │
└───────────────┴──────────────────────────────────────────────────────────────┘


# Run  npm install --save-dev webpack@5.42.1  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Regular expression denial of service                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ glob-parent                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ webpack [dev]                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ webpack > watchpack > watchpack-chokidar2 > chokidar >       │
│               │ glob-parent                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/1751                            │
└───────────────┴──────────────────────────────────────────────────────────────┘


found 3 vulnerabilities (1 low, 2 moderate) in 1092 scanned packages
  3 vulnerabilities require semver-major dependency updates.

NPM有自动修复的可能性。

$ npm audit fix

如果有SEMVER警告,让我们手动检查每个依赖关系,覆盖所有的警告,无论如何都要升级。

$ npm audit fix --force

NPM会相应地更新一切。是时候创建一个新的yarn.lock 文件了。拆除旧的,并打电话给yarn import

$ rm yarn.lock
$ yarn import

Yarn会根据你的package-lock.json ,创建锁文件。不再需要package-lock.json ,所以让我们摆脱它,再做一次审计。

$ rm package-lock.json 
$ yarn audit
yarn audit v1.22.10
0 vulnerabilities found - Packages audited: 945
✨  Done in 1.20s.

✨ 确实如此。提交,推送,并摆脱你所有的dependabot警报。