我有一个方便的命令可以在我的文件中查找 TODO 注释。它可以直接从命令行(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文件夹运行。
我不知道如何解决它。
最佳答案
原始命令行执行有效,因为 bash
shell 扩展表达式 --exclude-dir={node_modules,libs}
至--exclude-dir=node_modules --exclude-dir=libs
在调用grep
之前。 grep
很乐意多拿--exclude-dir
参数,它将排除与任何指定名称匹配的目录。
package.json
中命令的问题出现是因为 npm
不使用bash
运行命令。它使用普通的旧sh
运行命令。
在某些系统上sh
只是 bash
的另一个名称,并在这些系统上将原始命令放入 package.json
将工作。想必艾哈迈德的系统就是其中之一。
但是,在其他系统上(特别是 Debian 及其后代)sh
与bash
不相同。在这些系统上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'"
关于node.js - npm 脚本忽略 grep 命令的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55341432/