Xcode Build Process

一、build 日志

在 Xcode 的 Report navigator 中可以看到 build 日志(如下圖所示)湃番。

image.png

每一行任務就是一個 task夭织,每個 task顯示的信息有狀態(tài)、任務名吠撮、耗時摔癣,點擊最右邊的箭頭,可以展開每條任務的執(zhí)行細節(jié)纬向。類似這種格式:

CompileC /Users/xianglongchen/Library/Developer/Xcode/DerivedData/Playground_iOS-hfqoqrhlwhirthhjzanxhdrxyfoz/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/SDWebImage.build/Objects-normal/x86_64/UIView+WebCacheOperation.o /Users/xianglongchen/Desktop/Playground_iOS/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler (in target: SDWebImage)
    cd /Users/xianglongchen/Desktop/Playground_iOS/Pods
    export LANG=en_US.US-ASCII
...

可以看到上面的任務細節(jié)中其實就是由很多條 shell 命令組成的,包括 CompileC戴卜、Ld等逾条。

題外話:在 build log 中可以看到 Xcode 在構(gòu)建過程中會在 DerivedData 這個目錄下生成一些臨時數(shù)據(jù)

二、build 流程設(shè)置

1. Build Phases

Build Phases 從一個高層面上展示了整個構(gòu)建過程投剥,我們可以在 Build Phases 里設(shè)置各個 Phases 的配置項师脂,也可以新加一個或者多個 Build Phase。

image.png

上圖中所示的工程一共有 5 個 Phases江锨,build 時會按照其指定的順序執(zhí)行:

  • Target Dependencies:用來告訴 build system 在開始構(gòu)建當前 target 之前需要先構(gòu)建好哪些 target
  • [CP]Check Pods Manifest.lock:這是 CocoaPods 自動添加的一個 phase吃警,因為項目中使用了 CocoaPods
  • Compile Sources:告訴 build system 哪些資源需要參與編譯
  • Link Binary With Libraries:告訴 build system 在當前 target 的所有源碼編譯成目標文件后要跟哪些庫鏈接
  • Copy Bundle Resources:拷貝靜態(tài)資源(比如圖片、字體)到 app bundle 中

自定義 Build Phases

就像 CocoaPods 所做的那樣啄育,我們可以添加自定義的 Phases酌心,自定義 Build Phases 可以用來執(zhí)行腳本、拷貝資源等等挑豌。

2. Build Rules

Build Rules 用來指定不同文件類型分別應該如何被編譯安券。通常情況下,我們不需要修改默認的規(guī)則氓英,但是如果你想為一些新的文件類型添加自定義處理侯勉,你可以添加新的編譯規(guī)則。

3. Build Settings

在 Build Settings 中铝阐,我們可以設(shè)置每一個具體的 build 任務的細節(jié)址貌。

Build Settings 中提供的選項非常豐富,涉及到了 build 的每個階段,從編譯到鏈接再到代碼簽名和打包练对。

更詳細介紹的見 Xcode Build System Guide(最新版的 Build Settings Reference 可以在 Xcode Help中查看: 1. In Xcode, choose Help > Xcode Help, or open the Xcode Help website.2. Search for “build settings.”)遍蟋。

Tips:
在 Xcode 的 build setting 里面也可以通過 “option+鼠標左鍵雙擊” 來顯示幫助彈窗。


image

三锹淌、Project 文件

我們在前面所討論的所有設(shè)置最終都會被保存到 Xcode Project 文件中去匿值,Xcode Project 文件的格式是 .xcodeproj,這個文件實際上是一個文件夾赂摆。

平時我們基本上不會去看這個 .xcodeproj 文件的細節(jié)挟憔,除非你在 git merge 時遇到了沖突(嚴格上來講是 .xcodeproj 文件夾中的 project.pbxproj 文件)。

我們可以把這個 project.pbxproj 文件在文本編輯器中打開烟号,這個文件中的內(nèi)容的可讀性還是比較高的绊谭。

下面是一個示例項目的 project.pbxproj 文件簡化后的內(nèi)容(只保留了 PBXProject 部分的內(nèi)容):

// !$*UTF8*$!
{
    archiveVersion = 1;
    classes = {
    };
    objectVersion = 50;
    objects = {

/* Begin PBXBuildFile section */
/* End PBXBuildFile section */

/* Begin PBXBuildRule section */
/* End PBXBuildRule section */

/* Begin PBXFileReference section */
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
/* End PBXNativeTarget section */

/* Begin PBXProject section */
        856951B22201BD8C0098E0BE /* Project object */ = {
            isa = PBXProject;
            attributes = {
                LastUpgradeCheck = 1000;
                ORGANIZATIONNAME = xianglongchen;
                TargetAttributes = {
                    856951B92201BD8C0098E0BE = {
                        CreatedOnToolsVersion = 10.0;
                    };
                };
            };
            buildConfigurationList = 856951B52201BD8C0098E0BE /* Build configuration list for PBXProject "Playground_iOS" */;
            compatibilityVersion = "Xcode 9.3";
            developmentRegion = en;
            hasScannedForEncodings = 0;
            knownRegions = (
                en,
                Base,
            );
            mainGroup = 856951B12201BD8C0098E0BE;
            productRefGroup = 856951BB2201BD8C0098E0BE /* Products */;
            projectDirPath = "";
            projectRoot = "";
            targets = (
                856951B92201BD8C0098E0BE /* Playground_iOS */,
            );
        };
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
/* End XCConfigurationList section */
    };
    rootObject = 856951B22201BD8C0098E0BE /* Project object */;
}

可以看到這個 project.pbxproj 文件中的內(nèi)容非常清晰,甚至還有注釋汪拥,仔細對比一下达传,跟 Xcode 中打開時的信息可以一一對應起來,包括文件目錄結(jié)構(gòu)迫筑、build settings宪赶、build phases、build rules脯燃、target 等搂妻。

當你需要自動添加文件到 Xcode 工程中來時,可能就需要好好了解一下這個 project.pbxproj 文件了辕棚,不過已經(jīng)有不少大神們踩過坑了欲主,目前已知的一些不錯的解決方案:

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末补君,一起剝皮案震驚了整個濱河市引几,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挽铁,老刑警劉巖她紫,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屿储,居然都是意外死亡贿讹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門够掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來民褂,“玉大人,你說我怎么就攤上這事∩蘅埃” “怎么了面殖?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哭廉。 經(jīng)常有香客問我脊僚,道長,這世上最難降的妖魔是什么遵绰? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任辽幌,我火速辦了婚禮,結(jié)果婚禮上椿访,老公的妹妹穿的比我還像新娘乌企。我一直安慰自己,他們只是感情好成玫,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布加酵。 她就那樣靜靜地躺著,像睡著了一般哭当。 火紅的嫁衣襯著肌膚如雪猪腕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天钦勘,我揣著相機與錄音码撰,去河邊找鬼。 笑死个盆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的朵栖。 我是一名探鬼主播颊亮,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陨溅!你這毒婦竟也來了终惑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤门扇,失蹤者是張志新(化名)和其女友劉穎雹有,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼寄,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡霸奕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吉拳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片质帅。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煤惩,到底是詐尸還是另有隱情嫉嘀,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布魄揉,位于F島的核電站剪侮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洛退。R本人自食惡果不足惜瓣俯,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望不狮。 院中可真熱鬧降铸,春花似錦、人聲如沸摇零。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驻仅。三九已至谅畅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間噪服,已是汗流浹背毡泻。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粘优,地道東北人仇味。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像雹顺,于是被迫代替她去往敵國和親丹墨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容