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

使用NPM package.json配置变量时的引号处理问题咨询

问题根源分析

这个问题的核心是npm在传递配置变量中的引号时,会把引号本身作为参数的一部分传递给Jest,而非像直接写在scripts里那样,将引号当作shell的分隔符处理。你通过--debug看到的"**/test/*.cjs"带双引号,就是因为变量里的\"被转义成了实际的引号字符,导致Jest无法识别正确的文件匹配模式。

解决方案

方案1:移除配置变量中的引号

既然npm会保留引号,直接去掉变量里的转义引号即可:

// package.json
...
"config": {
  "testmatch": "--testMatch **/test/*.cjs"
},
"scripts": {
  "test1": "npx jest index.test $npm_package_config_testmatch"
}
...

此时传递给Jest的参数是正确的--testMatch **/test/*.cjs,shell会自动处理通配符,Jest能正常识别匹配规则。

方案2:用eval重新解析参数(适用于带特殊字符的模式)

如果你的匹配模式包含空格等特殊字符,必须保留引号,可以在脚本中用eval重新解析参数:

"scripts": {
  "test1": "eval 'npx jest index.test $npm_package_config_testmatch'"
}

eval会把变量内容当作shell命令重新解析,转义引号会被正确处理,最终传递给Jest的是无额外引号的匹配模式。

方案3:改用Jest配置文件(推荐)

更优雅的方式是把testMatch规则写入Jest配置文件,彻底避免命令行参数的引号问题:

// jest.config.cjs
module.exports = {
  testMatch: ["**/test/*.cjs"]
};

然后简化package.json的脚本:

"scripts": {
  "test": "npx jest index.test"
}

Jest会自动读取配置文件中的规则,无需在命令行传递testMatch参数。

方案4:直接写死脚本(适用于无需变量复用的场景)

如果这个匹配规则只在一个脚本中使用,直接像test2那样写死参数是最直接的方式,完全规避变量解析的问题。

内容的提问来源于stack exchange,提问作者ObiHill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:42:40