如何确定 bash 中是不是安装了 npm 模块
Posted
技术标签:
【中文标题】如何确定 bash 中是不是安装了 npm 模块【英文标题】:How to determine if npm module installed in bash如何确定 bash 中是否安装了 npm 模块 【发布时间】:2018-11-01 16:14:52 【问题描述】:我的目标是仅在此 npm 包不可用时才安装它。即使我已经全局安装了模块,它也会继续执行。
if [ npm list -g widdershins &> /dev/null ] || [ ! -d node_modules ]; then
npm install widdershins --no-shrinkwrap
fi
如何调整它以检测何时全局安装?
【问题讨论】:
如果模块已安装,则第一个子句的退出状态为 0 ("true"),这不是与您想要的相反吗? 【参考方案1】:package='widdershins'
if [ `npm list -g | grep -c $package` -eq 0 ]; then
npm install $package --no-shrinkwrap
fi
包括目录检查的替代方法:
package='widdershins'
if [ `npm list -g | grep -c $package` -eq 0 -o ! -d node_module ]; then
npm install $package --no-shrinkwrap
fi
说明:
npm list -g
列出所有已安装的软件包
grep -c $package
打印包含 $package 的行数(在我们的例子中被替换为 'widdershins')
-eq
是一个等号检查,例如$a -eq $b
如果 $a 等于 $b 则返回 true,否则返回 false。
-d
检查给定参数是否为目录(如果是则返回 true)
!
是否定运算符,在我们的例子中是否定 -d 结果
-o
是逻辑或运算符
总结一下:
第一个代码:如果安装了 $package,则 -eq 结果为假,这将导致 if 语句为假。如果 $package 没有安装,那么 -eq 结果为真(if 语句也为真)。 第二段代码:除了第一段代码的描述外,如果node_module是一个目录,则if语句为假。如果 node_module 不是目录,则 if 语句为真。由于逻辑或连接,这与 -eq 结果无关。This 也可以帮到你。
【讨论】:
这似乎不太奏效。widdershins@3.4.0
在 npm list -g
的输出中,但它仍在尝试安装
-eq 0 -o
是做什么的?
-eq
是一个等号检查。如果左运算符等于右运算符,则返回 true。 grep -c $package
计算所有包含 $package 的行(在这种情况下,所有包含字符串 'widdershins' 的行,对于 'widdershins@3.4.0' 也是如此)。这意味着:如果安装了 widdershins 包,则 npm list -g | grep -c $package
返回 1,这不等于 0(1 -eq 0 为假)。 -o
是逻辑 or
运算符。它将 -eq 结果与目录检查结果连接起来(! -d node_module
,如果 node_modules 不是目录,则为真)。希望这会有所帮助。
我认为问题在于它把它放在第 1 行,npm ERR! peer dep missing: mkdirp@>=0.5.0, required by mkdirp-promise@1.1.0
然后计数实际上显示在第 2 行
好的,如果我理解正确,那么我认为您还有另一个问题:基于缺少依赖项的问题。也许在这篇文章中你会找到帮助:***.com/questions/41275301/…【参考方案2】:
如果你想要一个班轮:
本地
npm list | grep widdershins || npm install widdershins --no-shrinkwrap
全球:
npm list -g | grep widdershins || npm install -g widdershins --no-shrinkwrap
【讨论】:
以上是关于如何确定 bash 中是不是安装了 npm 模块的主要内容,如果未能解决你的问题,请参考以下文章
安装好grunt,cmd 提示"grunt不是内部或外部命令" 怎么办