關(guān)于build system
build system將我們的源碼和資源文件轉(zhuǎn)變?yōu)閍pp.
在開發(fā)工程中當(dāng)你進(jìn)行以下行為時都會調(diào)用build system:
- Build, run, test, profile, analyze, or archive your project.
- Use Xcode Server to perform continuous integration of your projects.
- Use the xcodebuild command-line tool outside of Xcode.
每次調(diào)用build system構(gòu)建就是執(zhí)行一系列有序的任務(wù).最常見的就是 調(diào)用命令行工具編譯和link源文件; 執(zhí)行文件操作,例如復(fù)制文件; 或者執(zhí)行自定義的文件處理,例如生成Info.plist文件
工作流程
- 確定build target
- 檢索build configurations, build settings, build phases, and build rules.
- 檢查有無依賴target 或者 其他需要編譯其他target
- 準(zhǔn)備一個完整的構(gòu)建必須執(zhí)行的任務(wù)列表
- 如果額外的構(gòu)建任務(wù)是可能的,準(zhǔn)備額外的構(gòu)建任務(wù)
- 根據(jù)build phases執(zhí)行構(gòu)建任務(wù),如果有必要可以創(chuàng)建自定義的build rules
交互
有以下幾個部分可以對build system起影響作用.
- Workspaces:用來管理多個Project.iOS使用Workspace來管理多項目
- Projects
- Schemes
- Actions
- Targets
- Build settings
- Build configurations
- Build phases
- Build rules
- Build configuration (xcconfig) files
Build日志
我隨便找了一個工程編譯了一下, 可以在工程中如圖地方看到log文件,這里包含就是每一個任務(wù)
默認(rèn)情況下孝偎,上面的 Xcode 界面中隱藏了大量的信息教沾,我們通過選擇任務(wù)抄瓦,然后點擊右邊的展開按鈕宗兼,就能看到每個任務(wù)的詳細(xì)信息。另外一種可選的方案就是選中列表中的一個或者多個任務(wù),然后選擇組合鍵 Cmd-C,這將會把所有的純文本信息拷貝至粘貼板混槐。最后,我們還可以選擇 Editor 菜單中的 "Copy transcript for shown results"轩性,以此將所有的 log 信息拷貝到粘貼板中声登。
注意觀察輸出的 log 信息,首先會發(fā)現(xiàn) log 信息被分為不同的幾大塊,它們與我們工程中的targets相互對應(yīng)著:
Build target FMDB of project Pods with configuration Debug
...
Build target Masonry of project Pods with configuration Debug
...
Build target ReactiveCocoa of project Pods with configuration Debug
...
...
Build target Pods-Text of project Pods with configuration Debug
...
Build target Text of project Text with configuration Debug
針對工程中的每個 target悯嗓,Xcode 都會執(zhí)行一系列的操作件舵,將相關(guān)的源碼,根據(jù)所選定的平臺脯厨,轉(zhuǎn)換為機(jī)器可讀的二進(jìn)制文件铅祸。
接下來分析每個target中的log信息, 每一個任務(wù)都有一個名字
ProcessPCH ...
CompileC ...
Libtool ...
CpHeader ...
顧名思義:ProcessPCH 預(yù)處理頭文件,CompileC 用來編譯 .m 和 .c 文件,Libtool 用來從目標(biāo)文件中構(gòu)建 library合武,CpHeader拷貝頭文件.
將每個任務(wù)在展開詳細(xì)分析,可以了解任務(wù)更多的信息,在這里就不詳細(xì)介紹了.
Xcode 是如何知道哪些任務(wù)需要被執(zhí)行临梗?不要急,接著往下看.
Build過程的控制
我們選中一個project會在 project editor 頂部顯示出 6 個 tabs:General, Capabilities, Info, Build Settings, Build Phases 以及 Build Rules。
后面的三個選項與build過程緊密相連.
Build Phases
Build Phases 代表著將代碼轉(zhuǎn)變?yōu)榭蓤?zhí)行文件的最高級別規(guī)則稼跳。里面描述了 build 過程中必須執(zhí)行的不同類型規(guī)則:
- Compile sources. 關(guān)聯(lián)可編譯的源文件.這個階段每個target只能執(zhí)行一次.
- Headers. 為target關(guān)聯(lián)公共和私有的頭文件.如果構(gòu)建目標(biāo)是framework頭文件會被復(fù)制到product中,否則會不復(fù)制到product中.這個階段每個target只能執(zhí)行一次.
- Link binary with libraries. 這里面列出了所有的靜態(tài)庫和動態(tài)庫.
- Copy bundle resources. 關(guān)聯(lián)資源,拷貝到product文件夾下.這個階段每個target只能執(zhí)行一次且這個target支持嵌入資源.
- Copy files. 拷貝文件到product指定的路徑下.這個階段可被執(zhí)行多次
- Run script. 執(zhí)行一個指定的腳本文件在構(gòu)建過程中.這個階段可被執(zhí)行多次
- Target dependencies. target 依賴項的構(gòu)建盟庞。這里會告訴 build 系統(tǒng),build 當(dāng)前的 target 之前汤善,必須先對這里的依賴性進(jìn)行 build
Build Rules
Build rules 指定了不同的文件類型該如何編譯什猖。一般來說,開發(fā)者并不需要修改這里面的內(nèi)容红淡。如果你需要對特定類型的文件添加處理方法不狮,那么可以在此處添加一條新的規(guī)則。
Build Settings
至此锉屈,我們已經(jīng)了解到在 build phases 中是如何定義 build 處理的過程荤傲,以及 build rules 是如何指定哪些文件類型在編譯階段需要被預(yù)處理。在 build settings 中颈渊,我們可以配置每個任務(wù)(之前在 build log 輸出中看到的任務(wù))的詳細(xì)內(nèi)容。
你會發(fā)現(xiàn) build 過程的每一個階段终佛,都有許多選項:從編譯俊嗽、鏈接一直到 code signing 和 packaging。注意铃彰,settings 是如何被分割為不同的部分 -- 其實這大部分會與 build phases 有關(guān)聯(lián)绍豁,有時候也會指定編譯的文件類型。
這些選項基本都有很好的文檔介紹牙捉,你可以在右邊面板中的 quick help inspector 或者 Build Setting Reference 中查看到竹揍。
Reference: