dotfile 规则与「排除」的三种写法
两个高频实战问题:为什么 * 匹配不到 .env、** 不进 .git/?以及「我要全部 ts 文件,但排除测试和 node_modules」该怎么写?前者是 dot 规则,后者各家工具的 ignore / 否定语法各不相同——这页一次讲清。
1 · dot 规则:开头的 . 要显式对齐
glob 沿袭 Unix shell 的传统:文件名以 . 开头时被视作「隐藏」,通配符 * ? [...] 默认不去匹配它。准确说法是——某一段以 . 开头,则 pattern 对应段也必须以字面的 .
开头才命中。这条规则在目录维度同样成立:** 不会自己走进 .git/、.vscode/。多数实现(node-glob / minimatch 的 dot,本仓库实现的 { dot: true } 选项)提供一个开关放行——下面的 demo 直接把这个选项传给 matchGlob。
对照看:**/*.json 在 dot=false 时漏掉 .vscode/settings.json(** 不进 dot 目录);打开 dot 开关,或显式写 .vscode/*.json,它才回来。而 .gitignore、.env 这种文件名本身以点开头的,要靠
.* 一类显式点 pattern 命中。
2 · 排除:三家工具,三种设计
「圈一批、再排除一些」是 glob 最常见的真实需求,但怎么表达「排除」三家完全不同:
**node-glob 为什么不学 gitignore 用 !?**因为 ! 在 shell 里另有含义(历史扩展),且「include 与 exclude 混在一个列表里、靠顺序决定胜负」可读性差。node-glob 把两者拆成 pattern 和 ignore 两个清晰的入参;gitignore
则因为是「逐行声明、后行覆盖前行」的模型,! 的撤销语义反而自然。同一个符号在不同体系里意义截然不同,正是 glob「方言」的典型。