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

我已经安装了全球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包; 相反,我想升级由pouchdb-server软件包使用的graceful-fs的安装。

不能自己修复这个问题 ,你需要让软件包维护者升级他们的依赖关系

可以做的最好的办法是运行npm update -g (又名npm upgrade -g )来确保所有的(全局的,在这种情况下)软件包都被升级到最新版本的依赖关系,这取决于它们的依赖关系规范。 在他们各自的package.json文件中。

除此之外,除非所涉及的软件包本身被修改为取决于(允许取决于)其相关软件包的更新版本,否则在依赖关系中升级到更高版本号是不可能的。

软件包devise人员在相关软件包中指定了版本号的允许范围 ,由于规则(语义版本控制) ,超出该范围通常是不安全的。
不幸的是,这意味着很长一段时间没有更新其依赖关系的软件包将面临被Node.js / npm中的更改所淘汰的风险。


你的具体情况

pouchdb-server"couchdb-harness": "*"有依赖"couchdb-harness": "*" ,它指定任何 couchdb-harness版本都满足依赖关系(这是非常宽松的,可能以牺牲鲁棒性为代价)。

然而, couchdb-harness是个问题 ,它依赖于"glob": "~3.1.21" ,这意味着它不会安装和使用高于3.1.x glob软件包版本 – 请参阅npm的semver版本规范文档 。

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

从这里得到这个,

 $ 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 

对于优雅的fs尝试:

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

为什么需要全局安装pouchdb-server有一个特别的原因吗?

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

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

这是比较好的,因为它避免了使用相同依赖的其他软件包的副作用。 而且,你可以保持版本控制的所有依赖。

参考

npm package.json文件中依赖关系,devDependencies和peerDependencies之间有什么区别?