npm中package.json 文件的使用

140 阅读3分钟

在第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.10.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-stdin
  • optimist
  • string-width
  • strip-eof

反过来,这些包也需要其他的包,我们可以从一些包的requires 属性中看到。

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

它们按字母顺序被添加到文件中,每个都有一个version 字段,一个指向软件包位置的resolved 字段,以及一个integrity 字符串,我们可以用它来验证软件包。