Node与npm脚本中命令行正则参数匹配结果差异求助
问题原因分析
这是shell通配符展开行为差异导致的:
- 直接执行
node index.js --require src/**/*.js时,你的交互式shell(比如bash/zsh,通常默认开启globstar特性)会解析src/**/*.js这个glob模式,递归遍历src下所有子目录,把所有匹配的.js文件路径展开成命令行参数传给Node程序,所以process.argv能拿到全部文件。 - 但npm运行脚本时,默认用非交互式的sh shell(类Unix系统)执行命令。sh不支持
**这种递归glob,只会匹配当前目录下的文件——也就是src直接子级的a.js、b.js,不会处理shared子目录里的文件,最终传给Node程序的只有这两个文件。
解决办法
有两种常用方案:
方案1:让npm脚本用支持递归glob的shell
类Unix系统下,强制npm用bash执行脚本(bash支持globstar):
"scripts": { "test": "bash -c 'node index.js --require src/**/*.js'" }
Windows环境可以改用PowerShell,或者把Git Bash设为npm的默认执行shell。
方案2:让Node程序自己处理glob模式
把glob模式用引号包裹,避免shell提前展开,再用glob模块在代码里解析:
- 安装glob依赖:
npm install glob --save-dev
- 修改npm脚本:
"scripts": { "test": "node index.js --require 'src/**/*.js'" }
- 修改Node代码,用glob解析模式:
const glob = require('glob'); const args = process.argv.slice(2); const requireFlagIndex = args.indexOf('--require'); if (requireFlagIndex !== -1) { const pattern = args[requireFlagIndex + 1]; // 递归匹配所有符合模式的文件,排除目录 const matchedFiles = glob.sync(pattern, { nodir: true }); console.log('匹配到的文件:', matchedFiles); // 后续业务逻辑直接使用matchedFiles数组即可 }
这种方案跨平台兼容性更好,不依赖特定shell的特性。
内容的提问来源于stack exchange,提问作者Orodan
相关产品推荐
相关产品推荐

