【问题标题】:Package-lock.json - requires vs dependenciesPackage-lock.json - 需要 vs 依赖项
【发布时间】:2019-03-26 09:15:10
【问题描述】:

在依赖对象的 package-lock.json 中,我有 requiresdependencies 字段,例如

  "requires": {
    "@angular-devkit/core": "0.8.5",
    "rxjs": "6.2.2",
    "tree-kill": "1.2.0",
    "webpack-sources": "1.3.0"
  },
  "dependencies": {
    "rxjs": {
      "version": "6.2.2",
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz",
      "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==",
      "dev": true,
      "requires": {
        "tslib": "1.9.3"
      }
    }
  }

这两者有什么区别?为什么有些依赖列在requires,有些在dependencies,有些在这两个字段中?

【问题讨论】:

    标签: javascript node.js npm package-lock.json


    【解决方案1】:

    默认情况下,npm 将所有包直接安装在node_modules

    但是,假设包 X 在版本 1.0 中依赖于包 Z,而包 Y 依赖于相同的包 Z,但在版本 2.0 中。在这种情况下,我们必须安装这个包的两个版本。一个安装在根目录node_modules文件夹下,另一个安装在依赖包的node_modules文件夹下,例如

    package.json
    node_modules
        /X
        /Y
            /node_modules
                /Z@2.0
        /Z@1.0
    

    同样可能,npm 可以构建一个不同的但 still correct 的包树:

    package.json
    node_modules
        /X
            /node_modules
                /Z@1.0
        /Y
        /Z@2.0
    

    package-lock.json 文件不仅会尝试描述项目的依赖关系,还会尝试描述此树结构。上面要构建的两棵树中的哪一棵将在 JSON 中编码。

    有了这些知识,就很容易理解了:

    “requires”反映了这个依赖的package.json文件的依赖,而dependencies反映了这个依赖的node_modules文件夹中实际安装的依赖。

    【讨论】:

    • 与 ruby​​ 的 Gemfile.lock 相比,允许同一个包的多个版本一起使用要复杂得多。证明它的好处有点困难。
    • 不需要 SAT 求解器就可以安全地安装软件包。这里的另一个胜利是安装一个新的包不应该改变现有包的功能。它的所有权衡。
    【解决方案2】:

    看完上面的答案,也许我可以说得更简单:

    requires 可以在所有其他顶级依赖项中共享,而dependencies独立,只属于需要它们的模块。

    "@angular-devkit/core": "0.8.5""tree-kill": "1.2.0""webpack-sources": "1.3.0" 不属于模块。它们与需要它们的模块处于同一级别。相比之下,"rxjs": "6.2.2" 仅因需要它的模块而存在,并且仅由该模块使用。

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2018-11-06
      • 2017-12-16
      • 2020-01-16
      • 1970-01-01
      • 2020-11-19
      相关资源
      最近更新 更多