You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块在代码里解析:

  1. 安装glob依赖:
npm install glob --save-dev
  1. 修改npm脚本:
"scripts": {
  "test": "node index.js --require 'src/**/*.js'"
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:10:55