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

kov*_*ack 28 bash node.js npm circleci

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

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

它是完美的有这样的一行命令:

protractor --version || npm install -g protractor@2.1.0
Run Code Online (Sandbox Code Playgroud)

但是那个也会检查包版本的那个.

Jer*_*NER 21

用bash你可以做到

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

  • 它刚刚结束,几乎完美无缺.如果包不存在,它会抛出异常. (4认同)

An *_*yen 16

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

npm list protractor用于查找protractor包.

如果找不到包,它将返回npm ERR! code 1npm install protractor@2.1.0安装

  • 简短而简单。最好的单线在这里 (2认同)
  • 我使用的是 npm v6.0.1,并且不会出现 `npm list <invalid package>` 因错误退出,它只是返回一个包含“(empty)”的列表。 (2认同)
  • 使用较新的 npm 版本,“npm list <package name>”不会显示“npm ERR!” code 1` 但它确实退出并出现错误。因此,整个命令 `npm list <package name> || npm install <package name>` 仍然有效。 (2认同)

bis*_*hop 9

@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"
}
Run Code Online (Sandbox Code Playgroud)

使用如下:

$ install_package_if_needed protractor 2.1.0
Run Code Online (Sandbox Code Playgroud)

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

$ install_package_if_needed protractor 2.1.0 -g
Run Code Online (Sandbox Code Playgroud)