如何以在Windows&;上工作的方式在npm中循环文件;linux?
我试图在多个文件上运行单个命令(jshint)。mypackage.json包含如何以在Windows&;上工作的方式在npm中循环文件;linux?,npm,npm-scripts,Npm,Npm Scripts,我试图在多个文件上运行单个命令(jshint)。mypackage.json包含 “lint”:“jshint*.js**/*.js” 然而,这在Windows上失败了。在Windows上,语法为 在多个文件上运行单个npm脚本(例如jshint)是否有一种简单的、与平台无关的方法 (我对通用解决方案感兴趣。有人提到使用node jslint而不是jshint,后者确实支持多个文件……但IMO jshint>>jslint)。据我所知,您不能以跨平台的方式在shell中循环 但是,您可以使用并执
“lint”:“jshint*.js**/*.js”
然而,这在Windows上失败了。在Windows上,语法为
在多个文件上运行单个npm脚本(例如jshint)是否有一种简单的、与平台无关的方法
(我对通用解决方案感兴趣。有人提到使用node jslint而不是jshint,后者确实支持多个文件……但IMO jshint>>jslint)。据我所知,您不能以跨平台的方式在shell中循环 但是,您可以使用并执行以下操作:
catw "**/*.js" | jshint -
catw
将在不依赖shell的情况下扩展glob本身,并将文件写入stdout<代码>jshint-将从stdin读取。管道(|
)跨平台工作。我也不知道有一种平台无关的方式在外壳中循环
但是,对于在多个文件上运行单个npm脚本的平台无关解决方案(如您的示例所示)是:
.js
文件数组
,然后将其转换为字符串
jshint
可执行文件(包括所有路径的String
)npm脚本
“脚本”:{
“jshint”:“glob\”src/js/***.js\“| node.scripts/jshint.js”
},
注意cli glob(添加到package.json中)获取路径并将其传递到jshint.js
jshint.js
#/usr/bin/env节点
"严格使用",;
var path=require('path');
var readline=require('readline');
var exec=require('child_process')。exec;
var rl=readline.createInterface({
输入:process.stdin,
输出:null,
终端:错误
});
//规范化本地jshint可执行文件的路径。
var jshintexc=['.','node_modules','.bin','jshint'].join(path.sep);
var路径=[];
函数jshint(路径){
var命令=[jshintexc,路径].join(“”);
exec(命令、函数(错误、stdout、stderr){
如果(标准输出){
控制台日志(stdout);
}
如果(标准){
控制台日志(stderr);
}
});
}
rl.on('line',函数(srcPath){
push(srcPath);
});
rl.on('close',function(){
jshint(path.join(“”));
});
注意
第16行如下:
var jshintexc=['.','node_modules','.bin','jshint'].join(path.sep);
该脚本假定jshint
已在本地安装,并添加到包.json
的“devdependences”:{}
部分。也就是说,它指向在节点_modules/.bin
文件夹中找到的本地jhint
可执行文件,而不是全局安装的文件
如果您希望运行全局安装的jshint
,则将第16行更改为:
var jshintexc='jshint';
就个人而言,将其安装在本地是此场景的首选选项
多重全球化模式 您提供的示例包括多个glob模式
“lint”:“jshint*.js**/*.js”
的一个限制是它不接受多个glob模式。因此,一种解决方法是这样做:
catw "**/*.js" | jshint -
“脚本”:{
“jshint”:“npm运行jshint-a&&npm运行jshint-b”,
“jshint-a”:“glob\”*.js\“| node.scripts/jshint.js”,
“jshint-b”:“glob\”***.js\“| node.scripts/jshint.js”
},
是的,不是特别简洁-但很有效