如何在Bash中检测全局npm模块是否已安装并调整安装脚本
修正npm包安装检测脚本的方法
首先得指出你原脚本里的问题:你用[ npm list -g widdershins &> /dev/null ]这种写法是错误的——[其实是test命令,它不会执行里面的npm命令,而是把整个内容当作非空字符串来判断,所以这个条件永远为真,这就导致哪怕全局已经装了widdershins,脚本还是会执行安装操作。
要正确检测全局包是否安装,我们需要直接利用npm list -g命令的退出状态码:当包已全局安装时,该命令返回0;未安装时返回非0。基于这个逻辑,给你两种常用的修正方案:
方案1:仅当全局未安装时执行安装
如果你希望只要全局已经装了widdershins,就不管本地有没有,都跳过安装,用这个脚本:
if ! npm list -g widdershins &> /dev/null; then npm install widdershins --no-shrinkwrap fi
这里的!是取反操作,意思是“如果全局未安装widdershins”,就执行安装。&> /dev/null是把命令的输出和错误都屏蔽掉,避免冗余信息。
方案2:当全局和本地都未安装时才执行安装
如果你的需求是:只有当全局没装,而且当前目录也没本地安装widdershins时,才执行安装,那可以用这个写法:
if ! npm list -g widdershins &> /dev/null && ! npm list widdershins &> /dev/null; then npm install widdershins --no-shrinkwrap fi
这里额外加了! npm list widdershins &> /dev/null来检测本地是否未安装,两个条件同时满足才会执行安装。
整合原脚本的node_modules检测逻辑
如果你原脚本里的[ ! -d node_modules ]是想检测本地有没有node_modules目录,那可以把它整合到逻辑里,修正后的脚本如下:
# 全局未安装,或者本地没有node_modules目录时执行安装 if ! npm list -g widdershins &> /dev/null || [ ! -d node_modules ]; then npm install widdershins --no-shrinkwrap fi
这个写法就修正了原脚本的判断错误,现在只有当全局未安装,或者本地没有node_modules目录时,才会执行安装操作。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

