核心速览:在 VSCode 或 Cursor 中打开 Swift Monorepo 的子目录时,根目录的 .swiftlint.yml 往往无法生效。解决方案是在 .vscode/settings.json 中显式指定 swiftlint.configSearchPaths,并在配置文件中避免使用通配符路径。
在使用 Monorepo(单一代码仓库)管理 Swift 项目时,我们通常希望在根目录维护一份统一的 .swiftlint.yml 配置。然而,当使用 VSCode、Cursor(或其 VSCode 分支应用)直接打开项目中的某个子 Package 目录时,SwiftLint 插件往往无法自动向上查找到根目录的配置,导致 Lint 规则失效。
本文介绍如何通过正确配置路径,确保 SwiftLint 在 Monorepo 的任何层级都能正常工作。
环境要求
- 工具:SwiftLint 命令行工具
- 插件:VSCode/Cursor 中的 SwiftLint 插件
- 架构:典型的 Swift Monorepo 结构
MyProject/
├── .swiftlint.yml // 根目录统一配置
├── .vscode/settings.json // 根目录编辑器设置
├── Domain/
│ └── Package.swift
│ └── .vscode/settings.json // 子包编辑器设置
└── Persistent/
└── Package.swift
└── .vscode/settings.json
解决方案
要解决此问题,需要配合修改 VSCode 的设置文件和 SwiftLint 的配置文件。
1. 根目录编辑器设置
在项目根目录的 .vscode/settings.json 中,强制指定 SwiftLint 配置文件的搜索路径。这确保了当你打开根文件夹时,插件能准确锁定配置文件。
{
"swiftlint.configSearchPaths": [
".swiftlint.yml"
]
}
2. 修正 .swiftlint.yml (关键)
在根目录的 .swiftlint.yml 中,必须明确列出需要 Lint 的子目录路径。
❌ 避免做法:不要依赖默认扫描或使用模糊的通配符,这在某些插件实现中会导致路径解析错误。
✅ 推荐做法:显式指定 included 路径:
included:
- Domain/Sources
- Persistent/Sources
# - FeatureA/Sources
3. 子 Package 编辑器设置 (解决子目录打开问题)
这是很多开发者容易忽略的一步。如果你经常直接用 VSCode 打开 Domain 或 Persistent 文件夹进行独立开发,你需要在这些子目录中也创建一个 .vscode/settings.json,并指向上层的配置文件:
{
"swiftlint.configSearchPaths": [
"../.swiftlint.yml"
]
}
通过设置 ../.swiftlint.yml,即使工作区的根目录是 Domain,插件也能“顺藤摸瓜”找到父级目录的配置文件。
补充:SwiftFormat 配置
如果你同时使用 SwiftFormat,它的配置相对更智能一些,通常不需要在配置文件中硬编码路径,只需指定配置文件位置即可:
// 根目录 .vscode/settings.json
"swiftformat.configSearchPaths": [".swiftformat"]
// 子目录 .vscode/settings.json
"swiftformat.configSearchPaths": ["../.swiftformat"]