package-lock.json 文件
在安装 Node 包时,会自动生成 package-lock.json 文件。了解一下它是做什麽的吧!
在版本5中,npm 引入了 package-lock.json 文件。
这是什麽?你可能已经了解 package.json
文件,它更常见也存在更久。
该文件的目标是跟踪安装的每个包的确切版本,以便产品在各个环境中可以完全复制,即使包被维护者更新。
这解决了 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
,那就是确切的版本,将始终使用。
您不会将 node_modules 文件夹提交到 Git 中,因为它通常非常庞大。当您在另一台机器上使用 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
文件的示例结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| { "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-stdin
optimist
string-width
strip-eof
这些包又依赖其他包,正如我们从一些包的 requires
属性中可以看到的那样:
ansi-regex
is-fullwidth-code-point
minimist
wordwrap
strip-eof
它们按字母顺序添加到文件中,每个包都有一个 version
字段,一个指向包位置的 resolved
字段,以及一个我们可以用来验证包的 integrity
字符串。
tags: [“package-lock.json”, “npm”, “dependency management”]