关于javascript:说道npm依赖的话除了dependencies原来还有optionalDependencies

2次阅读

共计 1003 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0