node.js - 关于依赖关系的最佳实践

标签 node.js npm package.json semantic-versioning

保存 package.json 依赖项时的最佳实践是什么?

例如,我发现很多依赖项都没有修复,例如:

  "tslint": "~5.11.0"

我希望有固定的依赖关系,这样将来当新开发人员加入团队时,这种依赖关系就不会改变。

我对package-lock.json和shrinkwrap知之甚少,但我不确定这方面的“最佳实践”。 在本例中是一个 Angular 应用程序,但它可以是一切。例如,将 package-lock.json 保留在存储库上会导致过去出现一些问题(我知道!这是推送它的最佳实践!)

有什么想法吗?

最佳答案

简短回答:插入符 (^) 并提交 package-lock.json 可能是最好的方法。这确保了开发人员始终获得相同的依赖项,这是最不令人惊讶的。

<小时/>

为什么package-lock.json

npm 特别建议您提交 package-lock.json

It is highly recommended you commit the generated package lock to source control: this will allow anyone else on your team, your deployments, your CI/continuous integration, and anyone else who runs npm install in your package source to get the exact same dependency tree that you were developing on.

(来自npm documentation)

您提到将 package-lock.json 推送到您的存储库在过去引起了一些问题。我猜这是由于 this issue每次有人安装任何东西时,程序包锁都会被忽略并重写。根据 this answer,这不是正确的行为,并已在 npm@5.4.2 中修复。 .

您应该做的是省略package-lock.json并仅在package.json中指定确切的版本。如果这样做,您的顶级依赖项将看起来很好且一致,但它们的依赖项不会有锁定版本。这样,您遇到错误的可能性几乎相同,但更难发现。

<小时/>

为什么不使用npm-shrinkwrap.json

您还提到了收缩包装文件。收缩包装文件适用于

applications deployed through the publishing process on the registry

(来自npm documentation)

您可能没有 npm 发布您的 Angular Web 应用程序,因此没有理由使用 npm-shrinkwrap.json

<小时/>

为什么使用插入符范围?

我找不到任何文档说插入符 (^) 范围是最佳实践,但我相信它们是最佳实践。

npm 使插入符号范围成为默认选项,因此很明显他们认为这是最佳实践,尽管我找不到他们的任何文档来证明这一点。

使用默认值是最不令人惊讶的方法。如果我在 package.json 中看到任何其他类型的版本,我会认为它的更改是有充分理由的,并且在不知道原因是什么的情况下会犹豫更新包,即使它确实需要更新。

如果您决定一次更新所有依赖项,插入符号范围将为您提供良好的服务。您的依赖项通常会被锁定,但删除 package-lock.json 并重新运行 npm install 将自动安装最新版本,这些版本据称与您的版本向后兼容指定(有关插入符范围的详细信息,请参阅 the npm docs)。

<小时/>

总之,使用脱字符号范围和 package-lock.json 是标准做法。这满足了您对固定依赖项的要求,并提供了一些其他好处,因此最好遵循标准,除非您找到其他更改原因。

关于node.js - 关于依赖关系的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55484223/

相关文章:

javascript - 使用 npm 在多个 Node 项目目录中运行脚本

typescript - Npm 依赖冲突

node.js - npm 安装 PDFkit 失败

node.js - NodeJS 应用程序构建成功(Heroku),但启动时 Heroku 中出现应用程序错误

node.js - 得到 npm 模块 : How to retry for POST requests?

javascript - 如何在azure blob服务中等待操作完成

node.js - 如何解决 d3-array/src/number.js : unknown Statement of type "ForOfStatement" 语法错误

angular - 为什么我在 package-lock.json 中得到不同版本的依赖项?

node.js - npm package.json 操作系统特定脚本

mysql - 序列化数据库 :migrate failing with sequelize deprecated string error