为何相同通配符在shell与npm脚本中的执行表现存在差异?
通配符表现不一致的原因
你在终端直接执行命令时用的shell(通常是Bash、Zsh)默认开启了globstar选项,此时**会递归匹配所有层级的子目录。而npm run执行脚本时默认调用的是sh shell,绝大多数系统的sh默认关闭globstar,此时**只会匹配一级子目录,就出现了你遇到的差异。
正确的写法(按兼容性优先级推荐)
- 最稳妥的全环境兼容方案:用
find命令实现全层级匹配,不需要依赖shell的glob配置,适配所有shell环境:
修改npm脚本如下即可:
该写法可以正确匹配{ "scripts": { "test": "find ./src -type f -name \"*.js\"" } }./src下所有层级的.js文件,包括直接放在src根目录的js文件。 - 如果你不想更换命令只想调整glob写法:
可以在脚本中先开启globstar再执行原有命令,同时如果需要覆盖src根目录下的js文件,可以用{,**/}语法同时匹配根目录和子目录:{ "scripts": { "test": "shopt -s globstar && ls ./src/{,**/}*.js" } } - 如果你是给原生支持glob语法的工具(比如eslint、prettier)传路径:
把通配符用单引号包裹,避免shell提前解析通配符,交给工具自己处理glob逻辑即可:{ "scripts": { "lint": "eslint './src/**/*.js'" } }
内容的提问来源于stack exchange,提问作者wxttt
相关产品推荐
相关产品推荐

