人人都会AI编程

7.3 全局/项目/目录多级规则配置

更新时间:2026-06-28

实际工作中,不同场景需要不同的规范严格度。通过三级配置体系,既能保证团队一致性,又能灵活处理历史债务和特殊模块。

7.3.1 配置层级与优先级

配置采用就近覆盖原则,优先级由低到高:

全局配置(~/.config/) < 项目配置(<root>/) < 目录配置(<sub>/)

典型应用场景:

  • 全局:个人编码习惯(如缩进宽度、换行符)
  • 项目:团队规范(如 ESLint 规则、换行符强制 LF)
  • 目录:特殊处理(如 legacy/ 目录关闭严格规则,src/api/ 强制 JSDoc)

7.3.2 实战配置示例

EditorConfig 示例

# ~/.editorconfig(全局)
[*]
indent_style = space
indent_size = 4

# 项目根目录 .editorconfig
[*]
indent_size = 2          # 覆盖全局:项目统一 2 空格
end_of_line = lf

[src/legacy/**.js]       # 老代码目录特殊规则
indent_size = 4          # 保持原有 4 空格,避免大量 diff
max_line_length = off    # 暂不限制行长度

ESLint 示例

// 项目根目录 eslint.config.js
export default [
  { rules: { 'no-console': 'error' } },
  
  // 测试目录放宽规则
  {
    files: ['tests/**/*', '**/*.test.js'],
    rules: { 'no-console': 'off', 'max-lines': 'off' }
  },
  
  // 脚本目录允许 Node 全局变量
  {
    files: ['scripts/**/*'],
    languageOptions: { globals: { process: 'readonly' } }
  }
];

7.3.3 冲突解决策略

当配置冲突时,按以下逻辑处理:

| 场景 | 解决方案 | 示例 |
|------|---------|------|
| 相同规则不同值 | 子级覆盖父级 | 全局 4 空格 → 项目 2 空格 |
| 规则继承 vs 重置 | 显式 root = true 阻断继承 | 项目根目录 .editorconfigroot = true 忽略用户全局配置 |
| 多工具冲突 | 明确职责边界 | ESLint 管语法,Prettier 管格式,EditorConfig 管编辑器行为 |

7.3.4 最佳实践

  1. 项目级必须显式声明

在仓库根目录添加 root: true(ESLint)或 root = true(EditorConfig),防止用户全局配置干扰团队协作。

  1. 目录级配置注释说明

在特殊目录的配置文件顶部加注释,说明为何例外:

   // src/legacy/.eslintrc.js
   // 注意:此目录为 2018 年历史代码,暂不强制 TypeScript 规则
   
  1. CI 中验证配置生效

在流水线中检查配置是否正确加载:

   # 查看实际生效的规则
   npx eslint --print-config src/legacy/old.js
   
  1. 避免过度细化

目录级配置不超过 2 层(如 src/legacy/ 可以特殊,src/legacy/utils/ 不建议再特殊),维护成本过高。

提示:多数现代工具(Biome、Ruff、Prettier v3)已支持 overrides 字段,优先使用单一配置文件内的 overrides 替代多个物理配置文件,降低维护复杂度。