package-lock.json 文件

在版本 5 中,npm 引入了 package-lock.json 文件。

那是什么?你可能知道 package.json 文件,它更常见并且已经存在了很长时间。

package-lock.json 文件的目标是跟踪已安装的每个软件包的确切版本,以便产品以相同的方式 100% 可重现,即使软件包由其维护者更新。

这解决了 package.json 未解决的一个非常具体的问题。在 package.json 中,您可以使用 semver 表示法设置要升级到的版本(补丁或次要),例如:

  • 如果你写 ~0.13.0,你只想更新补丁版本:0.13.1 可以,但 0.14.0 不行。
  • 如果你写了^0.13.0,你想得到不改变最左边的非零数字的更新:0.13.10.13.2等等。如果您编写 ^1.13.0,您将获得补丁和次要版本:1.13.11.14.0 等等,直到 2.0.0 但不是 2.0.0
  • 如果你写 0.13.0,那就是将要使用的确切版本,总是

你不会提交到 Git 你的 node_modules 文件夹,它通常很大,当你尝试使用 npm install 命令在另一台机器上复制项目时,如果你指定了 ~ 语法和一个补丁版本软件包已发布,将要安装该软件包。 ^ 和次要版本也是如此。

如果您指定确切的版本,例如示例中的“0.13.0”,则不会受到此问题的影响。

可能是您,也可能是其他人试图通过运行“npm install”来初始化世界另一端的项目。

所以你原来的项目和新初始化的项目其实是不一样的。 即使补丁或次要版本不应该引入重大更改,我们都知道错误可以(因此,它们会)滑入。

package-lock.json 设置你当前安装的每个包的版本instone,并且npm 将在运行npm ci 时使用这些确切的版本。

这个概念并不新鲜,其他编程语言的包管理器(如 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-stdin
  • optimist
  • string-width
  • strip-eof

反过来,这些包需要其他包,正如我们从某些具有的 requires 属性中看到的那样:

  • ansi-regex
  • is-fullwidth-code-point
  • minimist
  • wordwrap
  • strip-eof

它们按字母顺序添加到文件中,每个都有一个“版本”字段,一个指向包位置的“已解析”字段,以及一个我们可以用来验证包的“完整性”字符串。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐