【问题标题】:Check if package installed from within Node.js script检查是否从 Node.js 脚本中安装了包
【发布时间】:2018-11-23 05:48:30
【问题描述】:

我正在尝试使用 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;
}

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

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

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

    npm ls some-package
    

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

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

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

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

    *至少对于节点 5.6.0 的我而言

    【讨论】:

    • 全局包使用:npm ls -g packagename
    【解决方案2】:

    我相信 NPM 文档拥有您的身份 looking for

    可选依赖项

    如果可以使用依赖项,但如果找不到或安装失败,您希望 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 中的条目将覆盖依赖项中的同名条目,因此通常最好只放在一个位置。

    【讨论】:

      【解决方案3】:

      享受吧。

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

      【讨论】:

        【解决方案4】:

        简单的解决方案,在脚本的顶部:

        try {
            require('glob')
        } catch {
            console.log("* To install glob, 'npm i glob'")
            process.exit(1)
        }
        const glob = require("glob")
        

        【讨论】:

          猜你喜欢
          • 2013-03-23
          • 2010-11-06
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-06
          相关资源
          最近更新 更多