如果尚未安装npm包,是否可以仅安装它?

53

如果尚未安装npm包,是否有可能只安装它?

我需要这样做来加速在CircleCI上的测试,但是当我运行npm install protractor@2.1.0等命令时,它总是下载并重新安装所有东西,然而,node_modules文件夹及其所有模块已经存在于运行命令时(从以前的构建中缓存),并且protractor --version等显示了所需包的版本。

最好有一个像下面这样的单行命令:

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

但是它还会检查软件包的版本。


1
[ -d path/to/protractor ] || npm install ... 是什么意思? - bishop
4
这是一个 Linux 命令,它的意思是:检查系统是否已经安装了名为 protractor 的软件,如果没有安装,则运行 npm install ... 命令进行安装。 - bishop
我需要检查当前安装的软件包版本,最好不用写软件包的完整路径。因为有多个不同的环境和不同的路径。 - kovpack
2
@bishop的答案非常适用于当您想要检查某个东西是否全局安装时。 - dimiguel
5个回答

56
你可以尝试使用 npm list protractor || npm install protractor@2.1.0
其中,npm list protractor 用于查找 protractor 包。
如果未找到该包,则会返回 npm ERR!code 1 并执行 npm install protractor@2.1.0 进行安装。

2
短小简洁,这里最好的一行代码。 - Sanctus
2
我使用的是npm v6.0.1,当执行npm list <invalid package>命令时,并没有出现错误提示,只是返回了一个列表,其中包含"(empty)"。 - MattTreichel
1
使用更新的npm版本,npm list <package name>不会显示npm ERR! code 1,但它确实会以错误退出。因此,整个命令npm list <package name> || npm install <package name>仍然有效。 - An Nguyen

23

使用Bash,您可以执行以下操作

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

4
刚刚证明几乎完美。如果包不存在,它会抛出异常。 - kovpack

10

这是优秀答案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 传递附加选项,请在版本后面指定它们,例如:

To pass additional options to npm, specify them after the version, like so:

$ install_package_if_needed protractor 2.1.0 -g

是的,谢谢。我做了类似的事情,但是从Ruby中调用了多个系统命令。但是这个版本对我的任务不适用。 - kovpack
谢谢这个。但需要移除 >/dev/null,否则 $i 将始终为空。 - Daryl Teo
@DarylTeo 谢谢!你说的对。不确定我当时在想什么。已修复! - bishop
如何将此通用化以全局安装缺失的软件包?目前它显然不接受“-g”标志。谢谢。 - nirvana-msu

2
[ $(node -p "try{require('protractor/package.json').version}catch(e){}") != "2.1.0" ]  && npm install grunt

0

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

这是针对 Windows 开发环境的。

这是我的解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接