翻譯@Xcode Concepts(Xcode若干概念解釋)
Xcode Target
target構(gòu)建產(chǎn)品(build product)癌淮,它包含一系列指令该默,基于一組來自于project或workspace的文件栓袖,進(jìn)行構(gòu)建。一個(gè)target對(duì)應(yīng)一個(gè)產(chǎn)品音榜;它負(fù)責(zé)為Xcode構(gòu)建體系提供輸入——源文件以及處理這些源文件的指令——最后輸出產(chǎn)品。一個(gè)project可以包含多個(gè)target捧弃。
用于構(gòu)建產(chǎn)品的指令以build settings和build phases的形式出現(xiàn)赠叼,其內(nèi)容可以在Xcode中查看违霞。target默認(rèn)繼承project的build settings嘴办,但開發(fā)者隨時(shí)可以通過修改target層面的build settings,打破這種繼承關(guān)系涧郊。(對(duì)于Xcode來說)一次只能有一個(gè)target處于激活狀態(tài);scheme負(fù)責(zé)對(duì)其進(jìn)行說明眼五。
一個(gè)target及其構(gòu)建的產(chǎn)品可以同另一個(gè)target關(guān)聯(lián)妆艘。為了構(gòu)建產(chǎn)品看幼,如果一個(gè)target需要以另一個(gè)target輸出的產(chǎn)品作為自己的輸入批旺,那么就可以說前者依賴于后者。如果兩個(gè)target位于同一個(gè)workspace下诵姜,Xcode會(huì)自動(dòng)發(fā)現(xiàn)這種依賴關(guān)系,順次構(gòu)建產(chǎn)品棚唆。這種關(guān)系被稱為隱式依賴
。開發(fā)者也可以在build settings中顯式的定義依賴關(guān)系翎卓,甚至可以規(guī)定兩個(gè)似乎有隱式依賴關(guān)系的target實(shí)際上沒有任何聯(lián)系。例如逗扒,在同一個(gè)workspace中,需要構(gòu)建一個(gè)庫(kù)和一個(gè)使用這個(gè)庫(kù)的應(yīng)用矩肩。Xcode會(huì)自動(dòng)發(fā)現(xiàn)二者之間的依賴關(guān)系黍檩,并首先構(gòu)建庫(kù)。然而始锚,如果我們的應(yīng)用只使用庫(kù)的某個(gè)特定版本刽酱,而非最新的,就可以在應(yīng)用的build settings中建立顯式依賴
瞧捌,覆蓋隱式依賴棵里。
Xcode Project
project好像倉(cāng)庫(kù),存放用于構(gòu)建一個(gè)或多個(gè)產(chǎn)品的文件姐呐,資源和信息殿怜。project包含構(gòu)建所需的元素,并維護(hù)各元素之間的關(guān)系曙砂。其可能擁有一個(gè)或多個(gè)target头谜,這些target規(guī)定了產(chǎn)品是如何構(gòu)建的。project定義了其下所有target的默認(rèn)build settings(每個(gè)tareget都有自己build settings麦轰,可以覆蓋project的build settings)乔夯。
project文件包含如下信息:
-
對(duì)源文件的引用(譯者:是引用,并非源文件本身):
- 源代碼款侵,包括頭文件和實(shí)現(xiàn)文件末荐;
- 庫(kù)和framework,包括內(nèi)部和外部的新锈;
- 資源文件甲脏;
- 圖片文件;
- Interface Builder(nib)文件
文件組妹笆,用于在右側(cè)的Project Navigator中組織源文件块请;
project層面的build configuration。開發(fā)者可以針對(duì)一個(gè)project創(chuàng)建多個(gè)
build configuration
拳缠;例如墩新,一般會(huì)有debug和release兩套build settings。(譯者:這里的意思是一個(gè)build configuration代表一套build settings)-
target窟坐,每個(gè)target定義了:
- 對(duì)其所構(gòu)建的產(chǎn)品的引用海渊;
- 對(duì)構(gòu)建產(chǎn)品所需的源文件的引用绵疲;
- 用于構(gòu)建產(chǎn)品的buld configuration(譯者:即build settings),包括同其他target的依賴關(guān)系臣疑,及其他設(shè)置盔憨;project層面的build settings會(huì)在沒有被覆蓋時(shí)使用;
-
用來debug或測(cè)試程序的運(yùn)行環(huán)境(譯者讯沈,可能有多個(gè))郁岩,每個(gè)運(yùn)行環(huán)境定義了:
- 從Xcode運(yùn)行或debug時(shí),啟動(dòng)哪個(gè)可執(zhí)行文件缺狠;
- 傳遞給可執(zhí)行文件的命令行參數(shù)问慎,如有;
- 程序運(yùn)行時(shí)需要設(shè)定的環(huán)境參數(shù)挤茄,如有蝴乔;
project可以獨(dú)立使用,也可以添加至workspace驮樊。
使用scheme來定義哪個(gè)target薇正,build configuration,及可執(zhí)行文件處于激活狀態(tài)囚衔。
Build Settings
每一項(xiàng)build setting代表一個(gè)變量挖腰,代表構(gòu)造過程中特定執(zhí)行細(xì)節(jié)。例如练湿,某些build setting定義了Xcode向編譯器傳遞的參數(shù)猴仑。
開發(fā)者可以定義project或target層面的build setting。前者默認(rèn)適用于其下所有target肥哎,后者可以覆蓋前者辽俗。
target負(fù)責(zé)組織構(gòu)建所需的源文件。一個(gè)build configruation代表一套build settings篡诽。例如崖飘,一個(gè)產(chǎn)品通常會(huì)有debug和 release兩個(gè)不同的build configuration。
build settings由兩部分組成:標(biāo)題和定義杈女。標(biāo)題代表某項(xiàng)build setting朱浴,可以用于定義其他build setting。定義可以是一個(gè)常量或者是一個(gè)Xcode公式达椰,后者的值要等到構(gòu)建時(shí)才能得出翰蠢。build settting還可能有展示名,用于在Xcode中顯示啰劲。
除了創(chuàng)建project時(shí)所生成的默認(rèn)build settings之外梁沧,開發(fā)者還可以創(chuàng)建自定義的build setting項(xiàng);以及依賴特定條件的build setting項(xiàng)蝇裤。后者的值取決于一個(gè)或多個(gè)先決條件是否達(dá)成廷支。例如埃碱,根據(jù)不同的架構(gòu)使用不同SDK。
Xcode Workspace
workspace組織project和其他文件酥泞,便于開發(fā)者統(tǒng)一處理。workspace能夠包含任意數(shù)量的project啃憎。除了組織文件外芝囤,它還可以為這些project和target設(shè)定依賴關(guān)系。
Workspaces拓展了工作流
project包含對(duì)源文件的引用辛萍,build configuration和其他相關(guān)信息悯姊。直到Xcode 3,proejct一直是所有文件組和文件結(jié)構(gòu)的根目錄贩毕。盡管可以引用其他project悯许,但同時(shí)管理多個(gè)關(guān)聯(lián)project仍然很不方便;工作流被局限在單個(gè)project中辉阶。自Xcode 4開始先壕,開發(fā)者可以通過創(chuàng)建workspace的方式來包含一個(gè)或多個(gè)proejct,及其他相關(guān)文件谆甜。
除了能夠訪問所有project包含的文件垃僚,workspace拓展了許多重要的Xcode工作流。例如规辱,得益于索引機(jī)制谆棺,諸如代碼補(bǔ)全,定義跳轉(zhuǎn)罕袋,及其他內(nèi)容檢測(cè)相關(guān)的特性改淑,一個(gè)workspace下的所有project都可以享受到。由于重構(gòu)操作的范圍是整個(gè)workspace浴讯,開發(fā)者重構(gòu)一個(gè)framework project中的API時(shí)朵夏,將影響所有使用這個(gè)framework的project。構(gòu)建時(shí)榆纽,一個(gè)project可以使用其他project的產(chǎn)品侍郭。
workspace文件只包含的project文件和其他文件的引用。project可以同時(shí)屬于一個(gè)或多個(gè)workspace掠河。下圖展示了一個(gè)workspace包含兩個(gè)Xcode project(Sketch和TextEdit)亮元,和一個(gè)文件project(Xcode4TransGuideDocPlan)。
同一個(gè)workspace下的project共享構(gòu)建目錄
默認(rèn)唠摹,一個(gè)workspace下的所有project都在同一個(gè)目錄下構(gòu)建爆捞,稱為workspace構(gòu)建目錄
(workspace build directory)。每個(gè)workspace都有自己的構(gòu)建目錄勾拉。因此煮甥,每個(gè)project都可以訪問任意文件盗温。如果一個(gè)庫(kù)被多個(gè)project使用,開發(fā)者不必一一拷貝成肘。(譯者:所謂build directory卖局,即構(gòu)建過程中,所有資源文件的集散目錄双霍。)
Xcode通過檢查構(gòu)建目錄砚偶,發(fā)現(xiàn)隱式依賴關(guān)系。例如洒闸,workspace下一個(gè)project構(gòu)建一個(gè)庫(kù)染坯,其被另一個(gè)project依賴,Xcode會(huì)自動(dòng)首先構(gòu)建前者丘逸,再構(gòu)建其他產(chǎn)品单鹿,即使(后者的)build configuration中并沒有明確的定義這種依賴關(guān)系。開發(fā)者可以使用顯式依賴關(guān)系覆蓋它深纲。為此仲锄,需創(chuàng)建project之間的引用。
workspace下的每個(gè)project仍然具有獨(dú)立性湃鹊。要單獨(dú)操作某個(gè)project——不影響或不被影響——開發(fā)者可以單獨(dú)打開這個(gè)project昼窗,或者將其添加到另一個(gè)workspace。一個(gè)project可以屬于一個(gè)或多個(gè)workspace涛舍,開發(fā)者可以任意組合澄惊,而不必重新配置project或workspace。
開發(fā)者可以使用workspace默認(rèn)的構(gòu)建目錄富雅,或自定義掸驱。注意,如果一個(gè)project定義了自己的構(gòu)建目錄没佑,那么在加入到一個(gè)workspace后毕贼,其會(huì)使用后者的構(gòu)建目錄。
Xcode Scheme
一個(gè)scheme定義了一組要構(gòu)建的target蛤奢,一個(gè)構(gòu)建時(shí)使用的build configuration鬼癣,以及一組要執(zhí)行的測(cè)試。
開發(fā)者可以定義任意數(shù)量的scheme啤贩,但每次只有一個(gè)處于激活狀態(tài)待秃。scheme可以保存在project或workspace中:若為前者,如果這個(gè)project加入一個(gè)workspace痹屹,那么所有project都可以使用章郁;若為后者,只有這個(gè)workspace中的project可以使用志衍。每當(dāng)開發(fā)者選中(激活)一個(gè)scheme暖庄,同時(shí)還需要選擇一個(gè)目標(biāo)設(shè)備(即產(chǎn)品運(yùn)行的硬件平臺(tái))聊替。