我有一个 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
文件中指示这组全有或全无的可选依赖项?
我不知道直接在 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;
}
}