我为eslint编写了一个npm脚本,它从文件名files.txt中读取输入文件的全局模式(到eslint),并在一个循环中使用这些输入一个接一个地调用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上打印出衬里警告和错误。
我无法理解为什么eslint没有从脚本中运行,尽管给了它输入文件glob模式。
发布于 2018-03-13 19:39:43
解决方案:
在file.txt中省略双引号可以解决通过bash运行时的问题。
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模式的文件将被线列,并且任何线性警告/错误都将被打印到stdout中。
进一步解释:
当您通过终端运行命令;./node_modules/eslint/bin/eslint.js "config/**/*.js"时,它是成功的,因为在eslint执行时,双引号实际上已被删除。
但是,当双引号存在于file.txt中时,它们将被保留,因此没有文件被链接。
跨平台:
你可能已经知道了..。在npm-脚本中使用的bash语法是不可传输的。也就是说,它只能通过bash shell成功运行,而不是跨平台运行。
为了确保跨平台支持,我建议只使用eslint的标准CLI/选项 (如per@ralphtheninja评论)。
但是,尽管如此,如果您必须从单独的files.txt中读取全局模式(跨平台支持是一项要求),那么也许编写一个节点实用程序脚本来处理该逻辑是一种更好的方法。然后,可以通过npm-script调用封装该逻辑的节点脚本。
https://stackoverflow.com/questions/49260448
复制相似问题