有关依赖项的最佳实践

时间:2019-04-02 22:06:19

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

在保存package.json依赖项时,哪种做法是最好的?

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

  "tslint": "~5.11.0"

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

我对package-lock.json和shrinkwrap知之甚少,但是我不确定这方面的“最佳实践”。 在这种情况下,是一个Angular应用程序,但可以包含所有内容。例如,将package-lock.json保留在存储库中会在过去引起一些问题(我知道!最好将其推送!)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

简短的回答:最好使用Carets(^)并提交package-lock.json。这样可以确保开发人员始终获得相同的依赖关系,并且最令人惊讶的是。


为什么package-lock.json

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

  

强烈建议您将生成的程序包锁定提交给源代码控制:这将允许您团队中的其他任何人,您的部署,您的CI /持续集成以及在程序包源中运行npm install的其他任何人都可以获取准确的信息您在其上开发的依赖树。

(来自npm documentation

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

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


为什么不npm-shrinkwrap.json

您还提到了wrapwrap文件。拆封文件适用于

  

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

(来自this answer

您可能没有npm publish使用角度的Web应用程序,因此没有理由使用npm-shrinkwrap.json


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

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

npm将插入号范围设置为默认选项,因此很明显他们认为这是最佳做法,尽管我找不到他们的任何文档来证明这一点。

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

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


总而言之,使用插入符号范围和package-lock.json是标准的。这样可以满足您对固定依赖项的要求,并提供其他一些好处,因此最好执行标准操作,除非您找到其他更改的理由。