可选的对等依赖

时间:2020-05-27 16:14:38

标签: typescript npm

我正在开发模块A。用户可以选择将Winston记录器注入到我的模块中,因此winston是其同级依赖项。

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

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

我该怎么办?

2 个答案:

答案 0 :(得分:3)

从 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 依赖项版本 > 1.0.0 <= 1.2.10,但如果它根本不存在,则您赢了不会出错,所以它也会被允许。

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

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

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

答案 1 :(得分:0)

只是对@tmilar 的回答的一个小补充。 我正在使用相同的方式添加可选的依赖项(还有 winston :)

"peerDependencies": { 
  "foo": "~2.3.0"
},
"peerDependenciesMeta": {
  "foo": {
    "optional": true
  }
}

对于可选的依赖项,您应该期待 require 和检查包版本的异常

let foo;
let fooVersion;
try {
  foo = require('i2g-lumberjack')
  fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}