何时使用 shrinkwrap、npm-lockdown 或 npm-seal

When to use shrinkwrap, npm-lockdown, or npm-seal

我的背景更熟悉 composer。我正在 gulp(等)进行构建过程并学习 node 以及如何使用 npm

非常奇怪(同样,来自 composer 背景)默认情况下不包含 composer.lock 类清单。话虽如此,我一直在阅读有关 [shrinkwrap]、[npm-lockdown] 和 [npm-seal] 的文档。 ...我阅读的文档越多,我就越困惑我应该选择哪一个(每个人都认为他们的方式是最好的方式)。我注意到的一个问题是 npm-seal 在 4 年内没有变化,npm-lockdown 在 8 个月内没有变化——这一切让我想知道这是不是因为最新版本的 [= 不需要它13=]...

  1. 各自的优点/缺点是什么?
  2. 在什么情况下我会在项目 A 中使用一个替代另一个,但在项目 B 中使用另一个?
  3. 每一项将如何影响我们的开发工作流程?

PS:如果您为每一个都提供了最基本的实现示例,则加分。 ;)

好问题 - 除了 shrinkwrap,我将跳过所有内容,因为根据 NPM's docs.

,这是 de-facto 的方法

长话短说 npm-shrinkwrap.json 文件类似于您在所有其他包管理器中使用的 lock 文件,尽管 NPM 允许同一包的不同版本通过隔离很好地协同工作- 从字面上将不同的整个版本范围界定并复制到树的不同级别的 node_modules。如果彼此 parent-child 的两个项目使用完全相同的版本,NPM 将仅将该版本复制到父项目,子项目将遍历树以查找包。

最佳做法是简单地为您的直接依赖更新 package.json,运行 npm install,验证开发过程中的一切正常,然后 运行 npm shrinkwrap 当你刚要提交并推送时。 注意: 确保在 运行 宁 npm install 之前 rm npm-shrinkwrap.json 在积极的开发过程中 - 如果您的直接依赖关系发生了变化,您需要 package.json要用的,不要锁!还要在您的 .gitignore 中包含 node_modules 或在您的源代码控制系统中包含等效项。然后,当您部署并进入 运行 项目时,运行 npm install 像往常一样。如果 npm 找到一个 npm-shrinkwrap.json 文件,它将使用该文件递归地拉取所有锁定的模块,并且它将忽略您的项目和所有依赖项目中的 package.json

npm shrinkwrap 是锁定依赖项的最标准方式。是的,npm install 默认情况下不会创建它,这很遗憾,npm 创建者绝对应该改变它。

npm-lockdown 正在尝试做与 npm shrinkwrap 相同的事情,npm-lockdown 有两点更好:它可以更好地处理可选依赖项并验证包裹:

https://www.npmjs.com/package/lockdown#related-tools

这两个功能对我来说似乎都不太相关;我对 npm shrinkwrap 很满意:例如,npmjs 保证一旦你在某个版本上传某个包,它就保持不变 - 所以检查 sha 校验和不是那么热(我从来没有遇到过由此引起的错误).

sealnpm shrinkwrap 一起使用。它添加了 'checksum checking' 方面。它看起来被遗弃而且很原始。

您可能会发现 shrinkpack 很有用——它会检查 npm install 下载的 tarball 并将它们捆绑到您的存储库中,然后最终重写 npm-shrinkwrap.json 以指向该本地包相反。

这样,您的项目就完全锁定了,完全可以离线使用,并且安装起来快得多。