明天解决了一个原本认为须要更换npm包,甚至须要批改npm包源代码的问题。简略解决的要害,在于晓得npm有一个optionalDependencies的依赖关系。

应用了一个ftp-srv的包,它依赖了bunyan,并且是不可选的依赖。

class FtpServer extends EventEmitter {  constructor(options = {}) {    super();    this.options = Object.assign({      log: buyan.createLogger({name: 'ftp-srv'}),      ...    }, options);

bunyan依赖的dtrace-provider,后者是一个native module。当npm install的时候,报错须要python。

侥幸的是,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参数将阻止装置可选依赖项。