如何在npm中升级全局包的依赖关系

时间:2016-12-19 00:37:50

标签: node.js npm versioning

我已安装全局pouchdb-server,我收到了有关graceful-fs的消息:

$ npm install -g pouchdb-server
npm WARN deprecated minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated graceful-fs@1.2.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.

正如消息所说,包将失败node > 7.0(我使用),所以我想知道如何进行升级。

如果我执行:

$ npm ls graceful-fs -g

我看到graceful-fs在几个全局包中使用,但唯一一个旧版本在`pouchdb-server:

├─┬ pouchdb-server@1.2.1
│ ├─┬ couchdb-harness@0.1.6
│ │ └─┬ glob@3.1.21
│ │   └── graceful-fs@1.2.3
│ ├─┬ http-pouchdb@1.1.3
│ │ └─┬ pouchdb@5.4.5
│ │   └─┬ lie@3.0.4
│ │     └─┬ es3ify@0.2.2
│ │       └─┬ jstransform@11.0.3
│ │         └─┬ commoner@0.10.8
│ │           └── graceful-fs@4.1.11
│ ├─┬ pouchdb-adapter-node-websql@6.1.0
│ │ └─┬ websql@0.4.4
│ │   └─┬ sqlite3@3.1.8
│ │     └─┬ node-pre-gyp@0.6.31
│ │       ├─┬ tar@2.2.1
│ │       │ └─┬ fstream@1.0.10
│ │       │   └── graceful-fs@4.1.9
│ │       └─┬ tar-pack@3.3.0
│ │         └─┬ fstream@1.0.10
│ │           └── graceful-fs@4.1.9
│ └─┬ pouchdb-node@6.1.0
│   └─┬ leveldown@1.5.0
│     └─┬ prebuild@4.5.0
│       ├─┬ node-gyp@3.4.0
│       │ ├─┬ fstream@1.0.10
│       │ │ └── graceful-fs@4.1.11
│       │ └── graceful-fs@4.1.11
│       └─┬ node-ninja@1.0.2
│         └── graceful-fs@4.1.11
├─┬ webpack@1.13.1
│ ├─┬ enhanced-resolve@0.9.1
│ │ └── graceful-fs@4.1.4
│ └─┬ watchpack@0.2.9
│   └─┬ chokidar@1.5.1
│     └─┬ fsevents@1.0.12
│       └─┬ node-pre-gyp@0.6.25
│         └─┬ tar@2.2.1
│           └─┬ fstream@1.0.8
│             └── graceful-fs@4.1.3

我已经尝试npm update -g graceful-fs但是这不起作用,升级作为全局包依赖的包的正确方法是什么?

请注意:我不想全局安装graceful-fs包;相反,我想升级graceful-fs包使用的pouchdb-server的安装。

3 个答案:

答案 0 :(得分:2)

无法自行解决此问题,您需要要求软件包维护者升级其依赖项

您所能做的最好的是运行npm update -g(又名npm upgrade -g),以确保所有(在本例中为全局)软件包升级到最新版本它们的依赖项规范所允许的依赖项。在各自的package.json文件中。

除此之外,无法在依赖项中升级到更高版本号,除非所讨论的软件包自己修改为依赖(允许依赖)更新版本的依赖包。

包装设计人员在相关包装中指定版本号的允许范围,由于semver (semantic versioning)的规则,超出该范围通常是不安全的。
不幸的是,这意味着长时间未更新其依赖项的软件包可能会被Node.js / npm中的更改淘汰。

查看您的具体案例

pouchdb-server依赖于"couchdb-harness": "*",它指定任何 couchdb-harness版本满足依赖性(这是非常宽松的,可能是以牺牲稳健性)。

couchdb-harness是问题,但是:它取决于"glob": "~3.1.21",这意味着无法安装并使用glob包版本高于3.1.x - 请参阅npm's docs on semver version specifications

(最新的glob 3.x程序包本身取决于"minimatch": "~0.2.11",这解释了另一个警告,但如果couchdb-harness更新其依赖关系,它将会消失最新 glob版本。)

答案 1 :(得分:0)

来自here

$ npm update minimatch
$ npm -v minimatch
2.10.1
$ npm install -g npm@3
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@3.10.5 /usr/local/lib/node_modules/npm
$ npm install -g minimatch@3.0.2
/usr/local/lib
└─┬ minimatch@3.0.2 
  └─┬ brace-expansion@1.1.6 
    ├── balanced-match@0.4.2 
    └── concat-map@0.0.1 

$ npm -v minimatch
3.10.5

对于graceful-fs尝试:

npm install -g graceful-fs graceful-fs@latest

答案 2 :(得分:0)

您是否需要在全球范围内安装pouchdb-server

请将其添加到packages.json下的peerDependencies,全局卸载,删除本地node_modules文件夹,然后从头开始安装。

通常建议不要全局安装 - 最好通过devDependenciespeerDependencies等安装软件包。

这是优选的,因为它避免了使用相同依赖性的其他包的副作用。此外,您可以将所有依赖项保留在版本控制中。

参考

What's the difference between dependencies, devDependencies and peerDependencies in npm package.json file?