关于依赖项的最佳实践
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 publish
ing 你的 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最佳实践。
当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践