YAML 的缩进规则是其语法中最重要也最容易出错的部分,正确理解和使用缩进是编写有效 YAML 文件的基础。
YAML 缩进的基本规则
1. 使用空格而非 Tab
YAML 严格禁止使用 Tab 字符进行缩进,必须使用空格。
yaml# ✅ 正确:使用空格缩进 server: host: localhost port: 8080 # ❌ 错误:使用 Tab 缩进(会导致解析错误) server: host: localhost port: 8080
2. 缩进层级一致性
同一层级的元素必须具有相同的缩进量。
yaml# ✅ 正确:一致的缩进 database: host: db.example.com port: 5432 name: myapp # ❌ 错误:不一致的缩进 database: host: db.example.com port: 5432 # 缩进过多 name: myapp
3. 推荐缩进量
虽然 YAML 没有强制规定缩进空格数量,但推荐使用 2 个空格作为标准缩进。
yaml# 推荐:2 个空格缩进 config: server: host: localhost port: 8080 database: type: postgresql ssl: true
缩进在不同结构中的应用
1. 映射(Map)的缩进
yaml# 基本映射 person: name: Alice age: 30 address: street: Main St city: Beijing country: China
2. 列表(List)的缩进
yaml# 列表项使用相同的缩进 fruits: - apple - banana - orange # 嵌套列表 matrix: - - 1 - 2 - 3 - - 4 - 5 - 6
3. 混合结构的缩进
yaml# 映射包含列表 user: name: Bob skills: - Python - JavaScript - Go # 列表包含映射 employees: - name: Carol role: Developer - name: Dave role: Designer
常见缩进错误
1. 混用空格和 Tab
yaml# ❌ 错误:混用空格和 Tab config: setting1: value1 setting2: value2 # Tab 缩进
2. 缩进不匹配
yaml# ❌ 错误:同一层级缩进不一致 server: host: localhost port: 8080 # 缩进过多
3. 冒号后缺少空格
yaml# ❌ 错误:冒号后缺少空格 name:Alice # 应该是 name: Alice
4. 多行字符串缩进错误
yaml# ❌ 错误:多行字符串内容缩进不一致 description: | This is line 1 This is line 2 # 缩进不一致 This is line 3
缩进调试技巧
1. 使用编辑器配置
在编辑器中配置 YAML 文件使用 2 个空格缩进:
VS Code 配置:
json{ "[yaml]": { "editor.insertSpaces": true, "editor.tabSize": 2, "editor.detectIndentation": false } }
2. 使用 YAML 验证工具
bash# 使用 yamllint 验证 YAML 文件 yamllint config.yaml # 使用 Python 验证 python -c "import yaml; yaml.safe_load(open('config.yaml'))"
3. 可视化缩进
在支持 YAML 的编辑器中,启用显示空白字符功能,可以清楚地看到缩进结构。
最佳实践
- 始终使用 2 个空格缩进
- 在编辑器中配置自动将 Tab 转换为空格
- 保持同一层级的一致缩进
- 使用 YAML linter 进行验证
- 在团队中统一缩进规范
- 使用 YAML Schema 验证文件结构
实际示例
yaml# 完整的 YAML 配置示例 apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: production data: server: host: api.example.com port: 443 tls: enabled: true cert_path: /etc/ssl/certs database: type: postgresql host: db.example.com port: 5432 name: appdb pool: min: 5 max: 20 features: - authentication - rate_limiting - logging - monitoring logging: level: info format: json outputs: - type: console level: debug - type: file path: /var/log/app.log rotation: max_size: 100M max_age: 30d