如何确定 bash 中是否安装了 npm 模块

Web*_*net 4 bash npm

我的目标是仅在此 npm 包尚不可用时才安装它。即使我已经全局安装了模块,这也会继续执行。

if [ npm list -g widdershins &> /dev/null ] || [ ! -d node_modules ]; then
    npm install widdershins --no-shrinkwrap
fi
Run Code Online (Sandbox Code Playgroud)

我如何调整它以检测何时全局安装?

OZZ*_*ZIE 15

如果你想要一个单衬:

当地的

npm list | grep widdershins || npm install widdershins --no-shrinkwrap
Run Code Online (Sandbox Code Playgroud)

全球的:

npm list -g | grep widdershins || npm install -g widdershins --no-shrinkwrap
Run Code Online (Sandbox Code Playgroud)


Ren*_*nop 11

package='widdershins'
if [ `npm list -g | grep -c $package` -eq 0 ]; then
    npm install $package --no-shrinkwrap
fi
Run Code Online (Sandbox Code Playgroud)

替代方案包括目录检查:

package='widdershins'
if [ `npm list -g | grep -c $package` -eq 0 -o ! -d node_module ]; then
    npm install $package --no-shrinkwrap
fi
Run Code Online (Sandbox Code Playgroud)

说明:

  • npm list -g列出所有已安装的软件包
  • grep -c $package打印包含 $package 的行数(在我们的例子中替换为 'widdershins')
  • -eq是一个等于检查,例如,$a -eq $b如果 $a 等于 $b,则返回 true,否则返回 false。
  • -d检查给定参数是否是目录(如果是则返回 true)
  • !是否定运算符,在我们的例子中是否定 -d 结果
  • -o是逻辑或运算符

把它们加起来:

  • 第一段代码:如果安装了 $package,则 -eq 结果为 false,这会导致 if 语句为 false。如果未安装 $package,则 -eq 结果为 true(并且 if 语句也为 true)。
  • 第二段代码:除了第一段代码的描述外,如果node_module是目录,则if语句为假。如果 node_module 不是目录,则 if 语句为 true。由于逻辑或连接,这与 -eq 结果无关。

也可以帮助你。