检查是否从Node.js脚本中安装了软件包

Col*_*rdo 4 node.js

我正在尝试使用Node.js进行脚本编写。

我有一个脚本,在其中检查的存在./node_modules/some-package。如果不存在,some-package则进行安装。

但是,这似乎有点骇人听闻。

有没有更好的方法来检查脚本中是否安装了特定软件包?

样例代码

const fs = require('fs');
let installed;

try {
  fs.accessSync('./node_modules/.bin/some-package');
  installed = true;
} catch (err) {
  installed = false;
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ust 7

我相信 NPM 文档有你要找的东西

可选依赖项

如果可以使用依赖项,但如果找不到或安装失败,您希望 npm 继续,那么您可以将它放在 optionalDependencies 对象中。这是包名称到版本或 url 的映射,就像依赖项对象一样。不同之处在于构建失败不会导致安装失败。

处理缺少依赖项仍然是您的程序的责任。例如,这样的事情:

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}
Run Code Online (Sandbox Code Playgroud)

optionalDependencies 中的条目将覆盖依赖项中同名的条目,因此通常最好只放在一个地方。


Cap*_*orn 5

问题方法的一个问题可能是node_modules文件夹的路径可能已更改(npm local install package到自定义位置)。

利用npm获取有关已安装软件包的信息的一种方法是通过npm ls

以下调用将返回的安装版本some-package

npm ls some-package
Run Code Online (Sandbox Code Playgroud)

如果软件包存在,它将打印版本信息,否则(empty)--json如果您想解析响应,请使用cli标志。

如果您对程序包是否存在感兴趣,可以使用退出代码:0程序是否存在,否则为非零。*

奖励:有关如何从nodejs执行shell命令,请参阅使用Node.js执行命令行二进制文件

来源: 查找已安装的npm软件包的版本https: //docs.npmjs.com/cli/ls

*至少对于节点5.6.0的我来说

  • 对于全局包使用: npm ls -g packagename (2认同)