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 插件
项目结构示例
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 的配置文件查找路径:
"swiftlint.configSearchPaths": [".swiftlint.yml"].swiftlint.yml 文件配置
配置中必须明确列出需要 lint 的子目录,不能使用通配符:
included:
- Domain/Sources
- Persistent/Sources此设置确保在打开 MyProject 目录时,SwiftLint 会正确处理这些指定路径下的源码文件。
子 Package 的 VSCode 设置
如果经常单独打开 Domain/ 或 Persistent/ 等子目录开发代码,需要在各自的 .vscode/settings.json 中添加以下设置:
"swiftlint.configSearchPaths": ["../.swiftlint.yml"]这样即使不通过根目录打开项目,SwiftLint 也能识别上层配置。
SwiftFormat 配置方式
SwiftFormat 的配置更简单,不需要在配置文件中指定 lint 路径,仅需设置配置文件查找路径:
// 根目录 settings.json
"swiftformat.configSearchPaths": [".swiftformat"],
// 子目录 settings.json
"swiftformat.configSearchPaths": ["../.swiftformat"]"加入我们的 Discord 社区,与超过 2000 名苹果生态的中文开发者一起交流!"