npm脚本忽略了grep命令的参数

时间:2019-03-25 15:39:11

标签: node.js bash npm

我有方便的命令可以在文件中查找待办事项。直接从命令行(ubuntu)可以正常工作。

这是普通的CLI命令:

grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'

这在package.json中出现

{
    "private": true,
    …
    "scripts": {
        "css:dev": "node tasks/postcss.js --mode development",
        "css:build": "node tasks/postcss.js --mode production",
        "js:dev": "webpack --mode development",
        "js:build": "webpack --mode production",
        "lint:css": "npx stylelint assets/css",
        "lint:js": "npx eslint assets/js",
        "images": "node tasks/images.js",
        "sprite": "node tasks/svgsprite.js",
        "todo": "grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'"
    }
}

使用npm或yarn运行时,它将忽略exlude参数,并遍历node_modules文件夹。

我不知道如何解决它。

1 个答案:

答案 0 :(得分:3)

原始命令行执行有效,因为bash shell在调用--exclude-dir={node_modules,libs}之前将表达式--exclude-dir=node_modules --exclude-dir=libs扩展为grepgrep很高兴接受多个--exclude-dir参数,它将排除与任何指定名称匹配的目录。

出现package.json中命令的问题是因为npm没有使用bash来运行命令。它使用普通的旧sh运行命令。

在某些系统上,sh只是bash的另一个名称,在那些系统上,将原始命令放在package.json中将起作用。大概艾哈迈德的系统就是其中之一。

但是,在其他系统(尤其是Debian及其子代)上,shbash并不相同。在这些系统上,sh是一个简单得多的shell,它不会扩展--exclude-dir={node_modules,libs}表达式。因此,grep看到了未扩展的参数,并认为它被告知要排除名称为{node_modules,libs}的目录。显然,这不会产生您想要的结果。

有两种明显的方法可以解决此问题。一种是告诉npm告诉sh启动bash shell来执行原始命令:

  "todo": "bash -c \"grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'\""

我之所以更喜欢另一个,是因为它不涉及多个级别的shell或嵌套/转义的引号,是在命令中显式指定两个目录名称:

  "todo": "grep -lir --color --exclude-dir=node_modules --exclude-dir=libs --exclude=package.json 'todo'"