package.json依赖性插入符号

时间:2019-02-15 09:42:20

标签: node.js package.json

假设在package.json文件中,我的依存关系为-

"dependencies": {
     "moment": "^2.22.2"
 }

在这里,我们是说对于包“ moment”,我们可以使用版本2.xx的任何功能(即,尽管我们在自己的应用中安装了2.22.2,但我们可以在应用中使用2.23.2提供的新功能。计算机)还是我们要说使用我们应用程序代码的其他任何人都可以使用任何2.xx版本的“ moment”软件包?

2 个答案:

答案 0 :(得分:0)

如果您设置:

"moment": "^2.22.2"

用户将几乎下载v2.22.2。在这种情况下,您将下载v2.24.0

如果您设置:

"moment": "2.22.2"

用户将完全下载该版本

如果您设置:

"moment": "~2.22.1"

用户将几乎下载v2.22.1。在这种情况下,您将下载v2.22.2

仅当模块遵守semver标准时,才可以使用v2.9.9中的功能。 99.999%的情况都是如此。

答案 1 :(得分:0)

  

我们可以使用任何2.x.x版本的功能吗(即,尽管我们在计算机上安装了2.22.2,也可以在应用程序中使用2.9.9提供的新功能)

只是为了避免造成混乱。您不会在计算机上安装版本2.22.2。通过说^ 2.22.2,npm将查找2.x.x的最高版本并安装该版本。您将永远不会安装版本2.22.2。您安装版本2.24,并在将其软件包更新为2.25.0时,将安装该版本。因此,您将始终安装最新的版本2.x.x,因此您将获得2.9.9的功能。

  

我们是说使用我们的应用程序代码的其他任何人都可以使用任何2.x.x版本的“ moment”包吗?

是的,您可以通过检出NPM创建的package-lock.json并描述确切的依赖关系树来验证这一点。 https://docs.npmjs.com/files/package-lock.json

如果您的package.json版本为1.0.0,并且您具有2.22.2的依赖性,并进行npm安装,则会在package-lock中看到。

{
  "name": "mypackage",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "moment": {
      "version": "2.24.0",
      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",

    }
  }
}

因此安装您的软件包1.0.0版的每个人都会获得2.24版的瞬间

  

为什么一旦安装“ moment.js”(即更新它),为什么   安装在我的计算机上–

您不必这样做。但是常见的规则是将node_modules保留在存储库之外,而只包含package.json。这样,当您将网站发布到例如AWS,Azure或DigitalOcean时,它们将在每次发布网站时进行npm安装并因此安装所有内容。

以阐明程序包的正常运行情况

  1. 您创建具有特定版本的程序包/模块
  2. 我决定使用您的包裹
  3. 所以我将进行npm install(以使用您的软件包)
  4. NPM将遍历依赖关系树并相应地安装版本。
  5. 我的网站正常运行,我很开心
  6. 与此同时,您正在更改代码并更新程序包。
  7. 几个月过去了,我决定更改自己的网站。所以现在当我进行npm install时(因为我更新了代码),我也将获得您的更新。