说道npm依赖的话,除了dependencies,原来还有optionalDependencies
今天解决了一个本来以为需要更换npm包,甚至需要修改npm包源代码的问题。简单解决的关键,在于知道npm有一个optionalDependencies的依赖关系。
今天发现了一个客户在安装的时候的问题:
也就是说dtrace-provider是一个本地包,这个包是被谁引用的呢。使用package.lock.json可以看到完整的依赖关系。bunyan依赖的dtrace-provider,后者是一个native module。当npm install的时候,报错需要python。
原来是使用了一个ftp-srv的包,它依赖了bunyan,并且是不可选的依赖。
class FtpServer extends EventEmitter {constructor(options = {}) {
super();
this.options = Object.assign({
log: buyan.createLogger({name: 'ftp-srv'}),
...
}, options);
幸运的是,bunyan对dtrace-provider的依赖,是可选依赖,没有也是可以的。要指明不需要可选依赖的话,只要在npm i的时候指定--no-optional标志。即使是多层的可选依赖,此标志也是有效的。
app -> ftp-srv -> bunyan -> dtrace-provider
在app内执行npm i--no-optional ,作为bunyan的可选依赖dtrace-provider也是不会安装的。
optionalDependencies
如果一个依赖关系可以被使用,但你希望npm在找不到它或安装失败的情况下继续进行,那么你可以把它放在optionalDependencies对象中。这是一个包名到版本或url的映射,就像依赖对象一样。不同的是,构建失败不会导致安装失败。
你的程序仍然有责任处理缺乏依赖的情况。例如,像这样
try {var foo = require('foo')
var fooVersion = require('foo/package.json').version
} catch (er) {
foo = null
}
如果
( notGoodFooVersion(fooVersion) ) {foo = null
}
// ...然后在你的程序中的后面...
if (foo) {foo.doFooThings()
}
optionalDependencies中的条目会覆盖dependencies中同名的条目,所以通常最好只放在一个地方。
而从https://docs.npmjs.com/cli/in... --no-optional参数将阻止安装可选依赖项。
可选依赖是2017年修改的,可以从这个issue看到
by the way ,八卦一下,bunyan发音是bunian,本意是金发女郎。
以上是 说道npm依赖的话,除了dependencies,原来还有optionalDependencies 的全部内容, 来源链接: utcz.com/a/43435.html