TL;DR: 在 Swift 项目的 monorepo 中,SwiftLint 默认无法识别根目录的
.swiftlint.yml
,特别是在 VSCode 或 Cursor 中单独打开子目录时。为解决这个问题,应在根目录和每个子 Package 的.vscode/settings.json
中显式设置swiftlint.configSearchPaths
指向配置文件路径,同时在配置中明确指定included
路径,避免使用通配符,以确保 lint 规则在整个项目中都能正常生效。
背景
在使用 monorepo 管理 Swift 项目时,通常只在根目录创建一个 .swiftlint.yml
配置文件。但当在 VSCode 或 Cursor 中打开项目目录或项目中的 Package 目录时,SwiftLint 可能无法正确加载该配置,导致 lint 规则未生效。本文说明在 monorepo 中正确设置 SwiftLint 的方法,确保 lint 正常工作。
配置要求
环境依赖
- 已安装 SwiftLint 命令行工具
- VSCode/Cursor 中安装了 SwiftLint 插件
项目结构示例
Bash
MyProject/
├── .swiftlint.yml // 根目录的 SwiftLint 配置
├── .vscode/settings.json // 根目录的 VSCode 设置
├── Domain/
│ └── Package.swift
│ └── .vscode/settings.json
└── Persistent/
└── Package.swift
└── .vscode/settings.json
配置步骤
根目录 VSCode 设置
在 .vscode/settings.json
中设置 SwiftLint 的配置文件查找路径:
JSON
"swiftlint.configSearchPaths": [".swiftlint.yml"]
.swiftlint.yml 文件配置
配置中必须明确列出需要 lint 的子目录,不能使用通配符:
YAML
included:
- Domain/Sources
- Persistent/Sources
此设置确保在打开 MyProject
目录时,SwiftLint 会正确处理这些指定路径下的源码文件。
子 Package 的 VSCode 设置
如果经常单独打开 Domain/
或 Persistent/
等子目录开发代码,需要在各自的 .vscode/settings.json
中添加以下设置:
JSON
"swiftlint.configSearchPaths": ["../.swiftlint.yml"]
这样即使不通过根目录打开项目,SwiftLint 也能识别上层配置。
SwiftFormat 配置方式
SwiftFormat 的配置更简单,不需要在配置文件中指定 lint 路径,仅需设置配置文件查找路径:
JSON
// 根目录 settings.json
"swiftformat.configSearchPaths": [".swiftformat"],
// 子目录 settings.json
"swiftformat.configSearchPaths": ["../.swiftformat"]