我为eslint编写了一个npm脚本,它从文件名files.txt读取输入文件(到eslint)的glob模式,并在循环中逐个调用eslint:
"eslint": "while IFS= read -r line; do echo $line; node ./node_modules/eslint/bin/eslint.js $line; done < files.txt"
files.txt
看起来像:
"server.js"
"config/**/*.js"
"modules/*/server/**/*.js"
"modules/core/client/app/config.js"
"modules/core/client/app/init.js"
"modules/*/client/*.js"
"modules/*/client/**/*.js"
当我跑步时:npm run eslint
这是我在终端上得到的:
"server.js"
"config/**/*.js"
"modules/*/server/**/*.js"
"modules/core/client/app/config.js"
"modules/core/client/app/init.js"
"modules/*/client/*.js"
"modules/*/client/**/*.js"
如果我在终端上运行./node_modules/eslint/bin/eslint.js "config/**/*.js"
,那么它会正常运行并在stdout上打印出linting警告和错误。
我无法理解为什么eslint没有从脚本运行,尽管给它输入文件glob模式。
答案 0 :(得分:0)
<强>解决方案:强>
在file.txt
中省略双引号可解决通过bash shell运行时的问题。
file.txt
的内容应改为:
server.js
config/**/*.js
modules/*/server/**/*.js
modules/core/client/app/config.js
modules/core/client/app/init.js
modules/*/client/*.js
modules/*/client/**/*.js
现在你跑步的时候; npm run eslint
,匹配每个glob模式的文件将被linted,任何linting警告/错误将打印到stdout
。
进一步说明:
运行命令时; ./node_modules/eslint/bin/eslint.js "config/**/*.js"
通过终端获得了成功,因为双引号实际上是在eslint
执行时删除的。
但是,当file.txt
中存在双引号时,它们会被保留,因此没有文件被删除。
跨平台:
您可能已经知道...您在npm-script中使用的bash语法不可传输。即它只能通过bash shell成功运行,而不能跨平台运行。
为确保跨平台支持,我建议您只使用eslint的标准 CLI/options (根据@ralphtheninja评论)。
然而,话虽如此,如果您必须从单独的files.txt
(并且需要跨平台支持)读取globbing模式,那么可能会编写一个节点实用程序脚本来处理这种逻辑是一种更好的方法。然后可以通过npm-script
调用封装该逻辑的节点脚本。