说道npm依赖的话,除了dependencies,原来还有optionalDependencies

今天解决了一个本来以为需要更换npm包,甚至需要修改npm包源代码的问题。简单解决的关键,在于知道npm有一个optionalDependencies的依赖关系。

今天发现了一个客户在安装的时候的问题:

image.png

也就是说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

回到顶部