npm 可选依赖项可以链接吗?

问题描述 投票:0回答:1

我有一个 NodeJS 项目,它由包

foo
增强,但不需要。但是,它仅在还安装了软件包
bar
的情况下才有效,并且
bar
并不直接需要
foo

我目前将

foo
bar
列为
optionalDependencies
中的单独条目,如下所示:

"optionalDependencies": {
  "foo": "1.x",
  "bar": "2.x"
}

但是,这可能会导致用户安装

foo
来增强功能,但会出现错误,因为他们没有安装
bar
optionalDependencies
属性需要字符串,但理想情况下我想将它们封装在这样的对象中:

"optionalDependencies": {
  "enhancement-module-group": {
    "foo": "1.x",
    "bar": "2.x"
  }
}

是否可以在我的

package.json
文件中指示这组全有或全无的可选依赖项?

node.js npm dependencies package.json
1个回答
0
投票

我不知道直接在 package.json 声明中执行此操作的方法。

一种选择是为这两个可选依赖项创建一个“虚构”包装器包。该包将非选择性地依赖于

foo
bar
,并且可以选择性地依赖于“主”项目:

主项目的

package.json
可以看起来像这样:

{
    "name": "main-project",
    "version": "1.0.0",
    "optionalDependencies": {
        "foobar": "1.0.0"
    }
}

然后你将拥有

foobar
依赖于
foo
bar
:

{
    "name": "foobar",
    "version": "1.0.0",
    "dependencies": {
        "foo": "1.2.3",
        "bar": "4.5.6"
    }
}

理论上,这会消除在不安装

foo
的情况下安装
bar
的一些灵活性(反之亦然),但这种灵活性似乎无论如何都没有用,因为该功能需要它们两者,并且只有一个可能会获胜不要太有用。

此外,如果该功能需要两个包都存在,您应该在代码中明确检查。例如:

let featureActive = true;
const requiredPackages = ['foo', 'bar'];
for (package of requiredPackages) {
    try {
        require(package);
    } catch {
        // At least one of the required packages isn't install
        // Feature can't be used
        featureActive = false;
        break;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.