【问题标题】:Is it possible to install npm package only if it has not been already installed?是否可以仅在尚未安装 npm 包的情况下安装它?
【发布时间】:2015-08-20 10:42:07
【问题描述】:

是否可以仅在尚未安装 npm 包的情况下安装它?

我需要这个来加快 CircleCI 上的测试,但是当我运行 npm install protractor@2.1.0 等时,它总是从 scracth 下载并安装它们,但是,在运行命令时,包含所有模块的 node_modules 文件夹已经存在(从以前的版本缓存)和protractor --version 等显示了所需的包版本。

拥有这样的单行命令是完美的:

protractor --version || npm install -g protractor@2.1.0

但也会检查包的版本。

【问题讨论】:

  • [ -d path/to/protractor ] || npm install ...?
  • command -v protractor >/dev/null 2>&1 || npm install ...?
  • 我需要检查当前安装包的版本,最好不要写包的完整路径。多种不同的环境、不同的路径等。
  • @bishop 的答案在您想检查是否全局安装了某些东西时效果很好

标签: node.js bash npm circleci


【解决方案1】:

你可以用 bash 做

[ $(node -p "require('protractor/package.json').version") != "2.1.0" ] && npm install protractor@2.1.0

【讨论】:

  • 几乎完美,因为它刚刚证明。如果包不存在,它会抛出异常。
【解决方案2】:

功能版优秀answer by @JeromeWAGNER

function install_package_if_needed() {
    local p=${1:-Package required}
    local v=${2:-Version required}
    shift 2
    local i=$(node -p "require('$p/package.json').version" 2>/dev/null)
    [ "$i" == "$v" ] || npm "$@" install "$p@$v"
}

像这样使用:

$ install_package_if_needed protractor 2.1.0

要将其他选项传递给npm,请在版本之后指定它们,如下所示:

$ install_package_if_needed protractor 2.1.0 -g

【讨论】:

  • 是的,谢谢。我做了这样的事情,但是从 ruby​​ 调用了多个系统命令。但正是这个版本不适用于我的任务。
  • 谢谢。但需要删除 >/dev/null 否则 $i 将始终为空。
  • @DarylTeo 谢谢!你说得对。不知道我在想什么。固定!
  • 如果缺少,如何将其推广到全局安装包?目前它显然不接受-g 标志。谢谢。
【解决方案3】:

我遇到了同样的问题,想从任何需要它们的“package.json”文件安装全局依赖项。

这是针对 Windows 开发环境的。

Here is my solution.

【讨论】:

    【解决方案4】:
    [ $(node -p "try{require('protractor/package.json').version}catch(e){}") != "2.1.0" ]  && npm install grunt
    

    【讨论】:

      【解决方案5】:

      你可以试试npm list protractor || npm install protractor@2.1.0

      其中npm list protractor 用于查找protractor 包。

      如果找不到包,会返回npm ERR! code 1并做npm install protractor@2.1.0进行安装

      【讨论】:

      • 简短而简单。这里最好的单线
      • 我在 npm v6.0.1 上并没有出现 npm list <invalid package> 退出并出现错误,它只是返回一个包含“(空)”的列表。
      • 对于较新的 npm 版本,npm list <package name> 不会显示 npm ERR! code 1,但它会退出并出现错误。因此,整个命令 npm list <package name> || npm install <package name> 仍然有效。
      猜你喜欢
      • 2016-12-13
      • 2012-06-23
      • 1970-01-01
      • 2015-11-03
      • 2021-01-22
      • 1970-01-01
      • 2013-03-27
      • 2020-01-04
      • 2015-06-28
      相关资源
      最近更新 更多