🔦

Monorepo 实战:解决 VSCode/Cursor 中 SwiftLint 配置失效问题

(更新于 )

核心速览:在 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 结构
Text
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 配置文件的搜索路径。这确保了当你打开根文件夹时,插件能准确锁定配置文件。

JSON
{
    "swiftlint.configSearchPaths": [
        ".swiftlint.yml"
    ]
}

2. 修正 .swiftlint.yml (关键)

在根目录的 .swiftlint.yml 中,必须明确列出需要 Lint 的子目录路径。

❌ 避免做法:不要依赖默认扫描或使用模糊的通配符,这在某些插件实现中会导致路径解析错误。

✅ 推荐做法:显式指定 included 路径:

YAML
included:
  - Domain/Sources
  - Persistent/Sources
  # - FeatureA/Sources

3. 子 Package 编辑器设置 (解决子目录打开问题)

这是很多开发者容易忽略的一步。如果你经常直接用 VSCode 打开 DomainPersistent 文件夹进行独立开发,你需要在这些子目录中也创建一个 .vscode/settings.json,并指向上层的配置文件:

JSON
{
    "swiftlint.configSearchPaths": [
        "../.swiftlint.yml"
    ]
}

通过设置 ../.swiftlint.yml,即使工作区的根目录是 Domain,插件也能“顺藤摸瓜”找到父级目录的配置文件。

补充:SwiftFormat 配置

如果你同时使用 SwiftFormat,它的配置相对更智能一些,通常不需要在配置文件中硬编码路径,只需指定配置文件位置即可:

JSON
// 根目录 .vscode/settings.json
"swiftformat.configSearchPaths": [".swiftformat"]

// 子目录 .vscode/settings.json
"swiftformat.configSearchPaths": ["../.swiftformat"]
相关提示

订阅 Fatbobman 周报

每周精选 Swift 与 SwiftUI 开发技巧,加入众多开发者的行列。

立即订阅