惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
B
Blog RSS Feed
A
About on SuperTechFans
V
Visual Studio Blog
J
Java Code Geeks
U
Unit 42
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
IT之家
IT之家
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
C
Check Point Blog
博客园 - 叶小钗
P
Proofpoint News Feed
Microsoft Security Blog
Microsoft Security Blog
B
Blog
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog

肘子的 Swift 记事本 | Fatbobman's Blog

从 pbxproj 到 xcproj:Xcode 工程配置迎来 JSON 格式 iPhone Duo 带来的机遇与挑战 -- 肘子的 Swift 周报 #153 当 Mac mini 的价格不再 mini -- 肘子的 Swift 周报 #152 SwiftData:优化从建模开始 举手之劳 -- 肘子的 Swift 周报 #151 从使用 AI 到委托 AI(下):我想要的可委托性 AI 想放弃了,人没有 -- 肘子的 Swift 周报 #150 从使用 AI 到委托 AI:我的一些思考 越来越慢的 App Review,拦住了谁? -- 肘子的 Swift 周报 #149 ContentBuilder 解析:SwiftUI 类型检查性能提升的秘密 Apple Intelligence 已通过中国政府审核,即将在中国提供服务 -- 肘子的 Swift 周报 #148 在 SwiftUI Text 中控制孤行:挖掘未公开的 avoidsOrphans 热茶还是冰咖啡 -- 肘子的 Swift 周报 #147 Liquid Glass:UIKit 适配踩坑实录 不是模型变慢了,是任务变大了 -- 肘子的 Swift 周报 #146 当灵感跑在了结果前面 -- 肘子的 Swift 周报 #145 当每一次写入都有了新价格 -- 肘子的 Swift 周报 #144 当 Linux 成为“空气”:容器、Agent 与不再重要的“桌面之争” -- 肘子的 Swift 周报 #143 两个 SwiftUI 动画 Bug 排查小记 SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142 Swift 还让你 Excited 吗? -- 肘子的 Swift 周报 #141 从 Size Class 到可用空间,horizontalSizeClass 还可靠吗? WWDC 26:AI 帮你看完了,然后呢? -- 肘子的 Swift 周报 #140 WWDC 2026 初印象:符合预期,但更务实 -- 肘子的 Swift 周报 #139 Core Data + Observation:从属性级响应到心智解放 稳定 > 新功能 -- 肘子的 Swift 周报 #138 用自定义 Layout 化解 SwiftUI List 的行高与间距跳变 从社区路标到生态基石:Dave Verwer 的新篇章 -- 肘子的 Swift 周报 #137 消失的 WWDC 愿望单 -- 肘子的 Swift 周报 #136 CocoaPods 正在退场,SwiftPM 才刚到第二章 -- 肘子的 Swift 周报 #135
Monorepo 实战:解决 VSCode/Cursor 中 SwiftLint 配置失效问题
东坡肘子 · 2025-04-24 · via 肘子的 Swift 记事本 | Fatbobman's Blog

Read in English

🔦

(更新于 )

核心速览:在 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 打开 DomainPersistent 文件夹进行独立开发,你需要在这些子目录中也创建一个 .vscode/settings.json,并指向上层的配置文件:

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

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

补充:SwiftFormat 配置

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

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

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

相关提示

订阅 Fatbobman 周报

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

立即订阅