如何以在Windows&;上工作的方式在npm中循环文件;linux?

如何以在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中循环 但是,您可以使用并执

我试图在多个文件上运行单个命令(jshint)。mypackage.json包含

“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
    文件
  • 通过管道将结果/路径从全局模式传输到自定义实用程序节点脚本
  • 然后在节点脚本中:
  • 使用节点模块读取通过管道传输到stdin的路径
  • 创建每个路径的
    数组
    ,然后将其转换为
    字符串
  • 使用节点模块运行
    jshint
    可执行文件(包括所有路径的
    String
  • 虽然此解决方案并非特别“简单”,但以下GIST演示了此过程:


    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”
    },
    
    是的,不是特别简洁-但很有效