【问题标题】:Optional peer dependency可选的对等依赖
【发布时间】:2020-09-14 18:30:18
【问题描述】:

我正在开发一个模块 A。用户可以选择将 Winston 记录器注入我的模块,因此 winston 是它的对等依赖项。

每当我将我的模块 A 安装在另一个我不想记录内容的模块中(因此我不包括 Winston)并尝试 tsc 它时,TS 都会大喊

Cannot find module 'winston' or its corresponding type declarations.

我该怎么做?

【问题讨论】:

    标签: typescript npm


    【解决方案1】:

    只是对@tmilar 答案的一个小补充。 我使用相同的方式来添加可选的依赖(还有winston :)) 该示例适用于支持 peerDependenciesMeta

    的 npm@7
    "peerDependencies": { 
      "winston": "~3.3.0"
    },
    "peerDependenciesMeta": {
      "winston": {
        "optional": true
      }
    }
    
    

    对于可选依赖项,您应该期望在 require 和检查包版本时出现异常

    let winston;
    let winstonVersion;
    try {
      winston = require('winston')
      winstonVersion = require('winston/package.json').version
    } catch (er) {
      winston = null
    }
    
    if (isUnsupportedVersion(winstonVersion) ) {
      winston = null
    }
    
    // .. then later in your program ..
    
    if (winston) {
      winston.doSomething()
    }
    

    【讨论】:

      【解决方案2】:

      从 NPM v7.x 开始,您可以使用 peerDependenciesMeta package.json 配置,它完全允许 ​​that option

      例如,在您的“模块 A”package.json

      "peerDependencies": { 
        "winston": "> 1.0.0 <= 1.2.10",
        "foo": "~2.3.0"
      },
      "peerDependenciesMeta": {
        "winston": {
          "optional": true
        }
      }
      

      在这种情况下,当安装模块 A 作为另一个项目的依赖项时,它将允许在指定的 semver 范围内安装 winston 依赖项版本&gt; 1.0.0 &lt;= 1.2.10,但如果它根本不存在,您将不会出错,所以它也将被允许。

      请注意,在此示例之后,仍然需要 foo 依赖项,因为它没有标记为 optional

      额外提示:您可以使用此实用程序https://semver.npmjs.com/ 检查和测试可用 NPM 包的范围,它对我也有帮助。

      PS。这是我对 SO 的第一个回答! :)

      【讨论】:

        猜你喜欢
        • 2019-10-18
        • 2020-01-06
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 2012-12-19
        • 1970-01-01
        相关资源
        最近更新 更多