核心概念
| 項目 | Project | Targets |
| 定義 | 整個工程容器,包含所有源碼、資源、配置文件 | 構建產物的具體「目標」,如 App、Framework、Unit Test、Extension 等 |
| 數量 | 一個工作區通常只有一個 Project | 一個 Project 可包含**多個 Targets**(如主 App + Today Widget + Watch App) |
| 配置範圍 | 全局默認設置(部署目標、Swift 版本、簽名團隊等) | 針對性覆蓋/繼承 Project 設置(Bundle ID、Info.plist、編譯標誌、依賴庫等) |
典型場景
- 主 App Target:生成
.app,包含主界面、業務邏輯。
- Framework Target:生成
.framework,供主 App 或其他 Target 復用代碼。
- Unit/UI Test Target:運行測試,依賴主 App Target。
- App Extension:如 Share Extension、Keyboard,獨立 Target 共享代碼。
配置繼承與覆蓋關係
- Target **默認繼承** Project 層面的 Build Settings。
- 在 Target 中修改某項設置,**僅影響該 Target**,Project 設置不變。
- 若多 Target 需共同設置,建議在 **Project 層面統一配置**,Target 保持繼承,避免重複維護。
- 例外:
Product Bundle Identifier、Info.plist 路徑、Code Signing 等**必須在 Target 級單獨設置**,因為每個產物唯一。
實操建議
- 通用編譯選項(警告等級、優化等級、Swift 版本、部署目標) → **Project 設置**。
- Target 專屬標識、簽名、依賴、資源 → **Target 設置**。
- 新增 Target 時,Xcode 會自動複製 Project 設置為初始值,隨後按需調整。
常見誤區
- 以為修改 Project 設置需同步改所有 Target → **錯**,Target 繼承 Project,除非 Target 顯式覆蓋。
- 將 Target 專屬配置(如 Bundle ID)寫在 Project → 導致多 Target 衝突。
總結
Project = 容器與默認值;Targets = 具體構建產物及其差異化配置。 善用繼承機制:通用配置放 Project,差異配置放 Target,構建清晰可維護。