【问题标题】:how to upgrade a dependency of a global package in npm如何在 npm 中升级全局包的依赖项
【发布时间】:2016-12-19 00:37:49
【问题描述】:

我已经全局安装了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 的安装。

【问题讨论】:

    标签: node.js npm versioning


    【解决方案1】:

    无法自行解决此问题,您需要要求包维护者升级他们的依赖项

    可以做的最好的事情是运行npm update -g(又名npm upgrade -g)以确保所有(全局,在这种情况下)包都按照允许升级到其依赖项的最新版本通过他们的依赖规范。在各自的package.json 文件中。

    除此之外,无法在依赖项中升级到更高版本号,除非相关软件包自身被修改为依赖(允许依赖)其依赖包的更新版本。

    包设计者在依赖包中指定一个允许的范围版本号,并且由于semver (semantic versioning)的规则,超出该范围通常是不安全的。
    不幸的是,这意味着长期没有更新其依赖项的包可能会被 Node.js/npm 中的更改淘汰。


    查看您的具体案例

    pouchdb-server"couchdb-harness": "*" 有依赖关系,它指定 any couchdb-harness 版本满足依赖关系(这是异常宽松的,可能以健壮性为代价)。

    couchdb-harness 是问题,但是:它依赖于"glob": "~3.1.21",这意味着它不会安装和使用高于3.1.xglob 软件包版本 - 见npm's docs on semver version specifications

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

    【讨论】:

    • 感谢您对正在发生的事情进行了详尽而详尽的解释!我刚刚在 couchdb-harness 存储库中打开了一个问题,要求他们升级依赖项
    【解决方案2】:

    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
    

    对于优雅的 fs 尝试:

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

    【讨论】:

    • 我已经编辑了我的问题以澄清我想要什么......我不想将graceful-fs安装为全局包,我想升级pouchdb制作的包的安装-服务器
    【解决方案3】:

    是否有特殊原因需要全局安装pouchdb-server

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

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

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

    参考文献

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

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 2019-10-31
      • 2015-11-21
      • 2011-02-21
      • 2013-06-17
      • 2014-03-18
      • 1970-01-01
      • 2021-12-25
      • 2012-03-17
      相关资源
      最近更新 更多