🔦 解决在 Monorepo 项目中 SwiftLint 配置文件无效

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"]
每周精选 Swift 与 SwiftUI 精华!