随着npm@5的发布,它现在将写入package-lock.json
,除非npm-shrinkwrap.json
已经存在。
我通过以下方式在全球范围内安装了npm@5:
npm install npm@5 -g
现在,如果在以下过程中发现npm-shrinkwrap.json
:
npm install
将打印一条警告:
npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!
所以我的收获是我应该用package-lock.json
代替收缩包装。
然而,为什么会有一种新的格式呢?package-lock.json
能做什么npm-shrinkwrap.json
做不到的事情?
这些文件具有完全相同的内容,但是npm处理它们的方式存在一些差异,其中大部分在package-lock.json和npm-shrinkwrap.json的文档页面上都有说明:
package-lock.json
永远不会发布到 npm,而npm-shrinkwrap
默认发布到 npmpackage-lock.json
不在顶级包中的文件将被忽略,但属于依赖项的收缩包装文件将被考虑npm-shrinkwrap.json
向后兼容 npm 版本 2、3 和 4,而package-lock.json
仅由 npm 5+ 识别
您可以通过运行npm shrinkwrap
将现有package-lock.json
转换为npm-shrinkwrap.json
。
因此:
-
如果不将包发布到 npm,则在这两个文件之间进行选择无关紧要。您可能希望使用
package-lock.json
,因为它是默认值,并且它的名称对 npm 初学者来说更清晰;或者,如果您难以确保开发团队中的每个人都使用 npm 5+,您可能希望使用npm-shrinkwrap.json
与 npm 2-4 向后兼容。(请注意,npm 5 发布于 2017 年 5 月 25 日;从该日期开始,向后兼容性将变得越来越不重要,因为大多数人最终会升级。 -
如果要将包发布到 npm,则可以选择:
- 使用
package-lock.json
准确记录您安装的依赖项版本,但允许安装您的软件包的人员使用与您的package.json
规定的版本范围兼容的任何版本的依赖项,或者 - 使用
npm-shrinkwrap.json
来保证安装包的每个人都获得所有依赖项的完全相同版本
文档中描述的官方观点是,选项 1 应该用于库(大概是为了减少当许多包的依赖项都依赖于同一辅助依赖项的略有不同的版本时导致的包重复量),但选项 2 对于将要全局安装的可执行文件可能是合理的。 - 使用
NPM 开发者的解释:
这个想法绝对是让package-lock.json成为最新的和 最伟大的收缩包装技术,npm-shrinkwrap.json 保留给那些非常关心的少数宝贵人 关于他们的图书馆有一个确切的node_modules - 并且为人们 谁希望 CI 使用 npm@>=2 安装特定树而没有 以提升其 npm 版本。
新的锁文件("package-lock.json")基本上共享了所有 与 npm-shrinkwrap 相同的代码,完全相同的格式(您可以重命名 他们彼此之间!这也是社区似乎认为的事情 理解:"它有一个锁定文件"似乎点击得更快 人。最后,拥有一个新文件意味着我们可以相对 与收缩包装的低风险向后兼容,无需做奇怪的事情 诸如父帖子中提到的允许发布之类的内容。
我认为这个想法是让 --save 和收缩包装默认发生,但避免在不需要的地方发生收缩包装的任何潜在问题。因此,他们只是给了它一个新的文件名以避免任何冲突。npm 的人在这里解释得更彻底:
https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/
相关引述:
默认情况下,npm 会发布源目录中的大多数文件,并且 人们多年来一直在发布收缩包装。我们不想 破坏兼容性。默认情况下使用 --save 和收缩包装,有 它意外进入并传播的风险很大 注册表,并基本上呈现我们更新 deps 和 重复数据删除...零。
所以我们选择了一个新名字。我们选择了一个全新的名称 突然。新的锁文件基本上共享所有相同的代码, 完全相同的格式
package-lock.json
版本保证只有npm ci
(因为如果与package.json
冲突,npm install
会覆盖package-lock.json
)。
npm-shrinkwrap.json
版本保证具有npm ci
和npm install
.