关于依赖项的最佳实践

Posted

技术标签:

【中文标题】关于依赖项的最佳实践【英文标题】:Best practice regarding dependencies 【发布时间】:2019-08-24 08:05:45 【问题描述】:

保存 package.json 依赖项的最佳做法是什么?

例如,我看到很多依赖项都不是固定的,例如:

  "tslint": "~5.11.0"

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

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

有什么想法吗?

【问题讨论】:

如果我可能会问,“固定”是指不更新依赖版本吗? 例如:tslint : 5.11.0 (没有 ~ 或 ^ ) 有一个选项可以实现没有 ^ 和 ~ 的依赖项。但简而言之, ^ 表示您将更新到最近的依赖项的主要版本,从而 ~ 将您更新到最近的次要版本。另请参阅:googleweblight.com/i?u=https://***.com/questions/…. 是的....我同意,我的意思是...指向一个确切的版本对我来说是有意义的,因此发生意外行为的可能性较小。比如“tslint”:“5.11.0”。但我没有找到任何来源来解释这是最佳做法 【参考方案1】:

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


为什么是package-lock.json

npm 特别推荐你提交package-lock.json

强烈建议您将生成的包锁定提交到源代码控制:这将允许您团队中的其他任何人、您的部署、您的 CI/持续集成以及在您的包源中运行 npm install 的任何其他人获得确切的您正在开发的相同依赖关系树。

(来自npm documentation)

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

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


为什么不npm-shrinkwrap.json

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

通过注册表上的发布过程部署的应用程序

(来自npm documentation)

你可能没有 npm publishing 你的 angular webapp,所以没有理由使用 npm-shrinkwrap.json


为什么要使用插入符号范围?

我找不到任何说明插入符号 (^) 范围是最佳做法的文档,但我相信它们是。

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

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

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


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

【讨论】:

这是公认的答案。现在我这样做没有任何问题:caret + package-lock.json 是完美的解决方案。我查了一下,是的……问题出在 npm 上的旧版本上。非常感谢!

以上是关于关于依赖项的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

csharp 演示使用select属性仅检索相关项的name属性的Aras最佳实践。

当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践

Jenkins管道最佳实践Top 10

依赖注入最佳实践和反模式

Sapper/Svelte/Rollup 外部依赖最佳实践?

关于函数返回的字符指针的最佳实践[关闭]