明天解决了一个原本认为须要更换 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 参数将阻止装置可选依赖项。