H5W3
当前位置:H5W3 > 其他技术问题 > 正文

说道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,本意是金发女郎。

未经允许不得转载:H5W3 » 说道npm依赖的话,除了dependencies,原来还有optionalDependencies

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址