提问者:小点点

检查是否从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;
}

共2个答案

匿名用户

该问题方法的一个问题可能是,node_modules文件夹的路径可能被更改(npm本地安装包到自定义位置)。

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

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

npm ls some-package

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

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

额外信息:关于如何从NodeJS执行shell命令,请参阅“使用Node.js执行命令行二进制文件”。

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

*至少对我来说是5.6.0节点

匿名用户

我相信NPM文档中有您想要的内容:

OptionalDependencies

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

您的程序仍然有责任处理缺乏依赖关系的问题。例如,像这样的东西:

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()
}

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