npm审计与yarn审计

4

我有一个React Native项目(0.61.4),使用yarn作为其包管理器。

当我运行yarn audit时,会报告大量漏洞:

18202 vulnerabilities found - Packages audited: 958823
Severity: 18202 High
  Done in 14.34s.

大多数都处于一些非常深的依赖路径中。例如:

┌───────────────┬──────────────────────────────────────────────────────────────┐
│ high          │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ lodash                                                       │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ >=4.17.12                                                    │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ react-native                                                 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ react-native > @react-native-community/cli >                 │
│               │ metro-react-native-babel-transformer > @babel/core > lodash  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://www.npmjs.com/advisories/1065                        │
└───────────────┴──────────────────────────────────────────────────────────────┘

当我运行npm audit时,它首先报告:
Neither npm-shrinkwrap.json nor package-lock.json found: Cannot audit a project without a lockfile

所以我运行:

npm i --package-lock-only

生成了一个package-lock.json文件。检查该文件,看起来是正确的。

现在运行npm audit,结果如下:

=== npm audit security report ===                        

found 0 vulnerabilities

我不明白这两个包管理器之间的差异。为什么npm报告0个错误,而yarn报告18.202个错误?

2个回答

5
没有查看两个锁文件并进行比较,很难估计为什么会发生这种情况。但据我所知,只有当这两个锁文件解析到相同依赖的不同版本时才会发生。
由于您的 yarn.lock 文件是早期生成的,因此其中包含了一些漏洞和旧版本的依赖项。而后来生成的 package-lock.json 应该已经解析到了这些依赖的最新/修复版本。
请注意,运行 npm i --package-lock-only 命令只会创建 package-lock.json 文件,并不会安装任何东西,但它将无法与实际安装的软件包保持一致。我认为您误以为运行该命令将从已安装的软件包中派生锁文件,但实际上它生成的锁文件就像没有使用该标志一样。
因此,总之,这两个锁文件都会解析到相同依赖的不同(次要/修补)版本。

1
这并不是Yarn和Npm之间一种苹果对苹果的比较。虽然它们没有报告完全相同的审计警告,但如果您执行以下操作,您可以从Yarn获得相同/类似的结果:
rm ./yarn.lock
yarn
yarn audit

因为 Yarn 使用了你以前的依赖管理工作中的知识,而 Npm 是从头开始的,从未在你的项目中运行过。如果你删除 yarn.lock,Yarn 也会重新开始。无论哪种方式,你都将得到所有库的最新补丁级版本,否则你将不会得到。这将导致许多审核警告消失。
那么什么是 yarn.lockpackage-lock.json?每次成功安装后,Yarn 都会将你的 node_modules(你的依赖树)的最新状态保存在 yarn.lock 中。NPM 在 package-lock.json 中执行相同的操作。这两个自动生成的文件就像你的 package.json 的详细版本,列出了你安装的每个依赖项和子依赖项(版本号下降到 x.x.x 补丁级别) - 以及它们被安装的原因。这样,每次运行 yarn installnpm install 时,你的 node_modules 将完全相同。
然而,这两个锁定文件仅由各自的软件包管理器使用,并且不兼容:如果您交替使用Yarn和Npm,则可能会不断更改您的node_modules。这将导致许多微妙的错误。因此,通常应该在一个项目中坚持使用Yarn或Npm。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接