在第5版中,npm引入了package-lock.json 文件。
那是什么?你可能知道package.json 文件,它更常见,存在的时间也更长。
该文件的目的是跟踪每一个被安装的软件包的确切版本,这样,即使软件包被其维护者更新,一个产品也可以100%地以同样的方式重现。
这解决了一个非常具体的问题,package.json ,而这个问题没有得到解决。在package.json中,你可以设置你想升级到哪个版本(补丁或次要版本),使用semver符号,比如说。
- 如果你写的是
~0.13.0,你希望只更新补丁版本:0.13.1可以,但0.14.0就不行。 - 如果你写的是
^0.13.0,你想更新补丁和次要版本。0.13.1,0.14.0,以此类推。 - 如果你写了
0.13.0,这就是将被使用的确切版本,始终如此。
你不会向Git提交你的node_modules文件夹,它通常是巨大的,当你试图通过使用npm install 命令在另一台机器上复制项目时,如果你指定了~ 语法,并且一个包的补丁版本已经发布了,那个版本将被安装。^ 和次要版本也一样。
如果你指定了精确的版本,如例子中的
0.13.0,你就不会受到这个问题的影响。
这可能是你,或者另一个人试图在世界的另一端通过运行npm install 来初始化项目。
所以你的原始项目和新初始化的项目实际上是不同的。即使一个补丁或小版本不应该引入破坏性的变化,我们都知道错误可以(所以,他们会)滑入。
package-lock.json 将你当前安装的每个软件包的版本设置为石头,npm 在运行npm install 时将使用这些精确的版本。
这个概念并不新鲜,其他编程语言的包管理器(如PHP中的Composer)使用类似的系统已有多年。
package-lock.json 文件需要提交到你的 Git 仓库,这样它就可以被其他人取走,如果项目是公开的或者你有合作者,或者你用 Git 作为部署的来源。
当你运行npm update 时,依赖的版本将在package-lock.json 文件中更新。
一个例子
这是一个例子,当我们在一个空的文件夹中运行npm install cowsay ,我们得到的package-lock.json 文件的结构。
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.
0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"cowsay": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz"
,
"integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkM
Ajufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==",
"requires": {
"get-stdin": "^5.0.1",
"optimist": "~0.6.1",
"string-width": "~2.1.1",
"strip-eof": "^1.0.0"
}
},
"get-stdin": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.
1.tgz",
"integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/
is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"minimist": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10
.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
},
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
"requires": {
"minimist": "~0.0.1",
"wordwrap": "~0.0.2"
}
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
}
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "^3.0.0"
}
},
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
}
}
}
我们安装了cowsay ,它依赖于
get-stdinoptimiststring-widthstrip-eof
反过来,这些包也需要其他的包,我们可以从一些包的requires 属性中看到。
ansi-regexis-fullwidth-code-pointminimistwordwrapstrip-eof
它们按字母顺序被添加到文件中,每个都有一个version 字段,一个指向软件包位置的resolved 字段,以及一个integrity 字符串,我们可以用它来验证软件包。