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

时间:2018-06-13 15:14:32

标签: 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;
}

3 个答案:

答案 0 :(得分:2)

问题方法的一个问题可能是,node_modules文件夹的路径可能会更改(npm local install package to custom location)。

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

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

npm ls some-package

如果包存在,它将打印版本信息,否则为(empty)。如果要解析响应,请使用--json cli-flag。

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

奖励:有关如何从nodejs执行shell命令,请参阅Execute a command line binary with Node.js

来源: Find the version of an installed npm packagehttps://docs.npmjs.com/cli/ls

*至少对我来说是节点5.6.0

答案 1 :(得分:0)

我相信NPM文档具有您的looking for

  

<强> optionalDependencies

     

如果可以使用依赖项,但是如果无法找到或无法安装,您希望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()
}
     

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

答案 2 :(得分:0)

享受。

  function isInstalled(x) {
    try {
      return (
        process.moduleLoadList.indexOf("NativeModule " + x) >= 0 ||
        require("fs").existsSync(require.resolve(x))
      );
    } catch (e) {
      return false;
    }
  }