project
譯自apple 官方文檔中的 Xcode Project
Xcode中的project是一個(gè)包含了所有文件、資源以及構(gòu)建一個(gè)或者多個(gè)product所需信息的一個(gè)倉(cāng)庫(kù)。project包含編譯product所用的所有元素,并幫我們組織這些元素之間的關(guān)系。一個(gè)project可以包含一個(gè)或者多個(gè)target,target指定了如何編譯product。project定義了其內(nèi)部所有target的默認(rèn)編譯配置(每個(gè)target可以通過(guò)重新設(shè)置(重寫(xiě))編譯配置來(lái)定義自己的特殊編譯配置)。
project包含了以下信息:
1、對(duì)如下源文件的引用:
(1)代碼的.h文件和.m文件
(2)Libraries 和 frameworks
(3)Resource files(資源文件,如文本,xml,plist等)
(4)圖片
(5)Interface Builder files(xib、storyboard等)
2、用來(lái)組織資源文件的group(比如哪個(gè)文件放在哪個(gè)文件夾路徑下)
3、project級(jí)別的編譯配置,比如你對(duì)debug、release兩種環(huán)境的分別設(shè)置。
4、targets的配置,這些配置指定了:
(1)工程編譯的引用
(2)工程編譯所需要的資源文件的引用
(3)工程編譯的編譯配置,包括對(duì)其他target和配置的依賴(lài)關(guān)系,還包括沒(méi)有target重寫(xiě)(覆蓋)的project級(jí)別的編譯配置
5、用于debug和測(cè)試程序的執(zhí)行環(huán)境,這些執(zhí)行環(huán)境指定了:
(1)xcode在run或debug時(shí)的可執(zhí)行文件
(2)傳遞給可執(zhí)行文件的命令行參數(shù)(若有)
(3)程序運(yùn)行時(shí)設(shè)置的環(huán)境變量(若有)
一個(gè)project可以獨(dú)立存在,也可以包含在一個(gè)workspace下。
你可以用Xcode schemes來(lái)指定當(dāng)前的target、編譯配置、可執(zhí)行文件配置。
target
譯自apple 官方文檔中的 Xcode Target
target指定了要編譯的product, 并包含’用project 或 workspace里中的一系列文件來(lái)編譯一個(gè)product的說(shuō)明‘。一個(gè)target只能定義一個(gè)product,target將輸入(包括編譯product所需的源文件和處理這些源文件的說(shuō)明)組織到構(gòu)建系統(tǒng)中。一個(gè)project可以包含一個(gè)或多個(gè)target,每個(gè)target可以對(duì)應(yīng)產(chǎn)生一個(gè)product。
上面的編譯一個(gè)product的說(shuō)明的表現(xiàn)形式就是我們xcode里的build settings和 build phases。
一個(gè)target和由它產(chǎn)生的product可以關(guān)聯(lián)其他的target。如果一個(gè)target的編譯依賴(lài)于另外一個(gè)target的輸出,我們就說(shuō)前者依賴(lài)于后者;如果這兩個(gè)target在同一個(gè)workspace中,Xcode就能識(shí)別這個(gè)依賴(lài);這種依賴(lài)關(guān)系我們稱(chēng)之為隱式依賴(lài)(implicit dependency)。你也可以在build settings明確指定target依賴(lài)關(guān)系,也可以將Xcode中的隱式依賴(lài)指定為無(wú)依賴(lài)關(guān)系,比如,你可以同時(shí)編譯處于同一workspace中的library和鏈接這個(gè)library的application,Xcode會(huì)識(shí)別library和application的關(guān)系,然后先編譯library,但是如果你的本意是想要鏈接這個(gè)library的version而不是library本身,你可以在build settings中創(chuàng)建一個(gè)顯式的依賴(lài)來(lái)覆蓋這個(gè)隱式依賴(lài)。
workspace
譯自apple 官方文檔中的 Xcode Workspace
workspace是一種xcode文件,用于分組projects和其他文件,便于我們使用它們。workspace可以包含多個(gè)project和其他你想要引入的文件。除了組織各個(gè)project中所有的文件之外,workspace還提供存在于projects和它們對(duì)應(yīng)targets之間的隱式和顯式關(guān)系。
一個(gè)project可以屬于多個(gè)workspace。
默認(rèn)情況下,workspace中的projects編譯在同一目錄下,我們稱(chēng)之為workspace build directory,每個(gè)workspace都有各自的編譯目錄。因?yàn)橥粀orkspace下的每個(gè)project中的所有文件都在同一編譯目錄下,所以這些文件彼此之間是相互可以引用的。因此,如果workspace中的多個(gè)projects使用了相同的libraries的時(shí)候,我們就不需要給每個(gè)工程都拷貝一個(gè)。
workspace中每個(gè)project依然都是獨(dú)立的。如果你想單獨(dú)的使用這個(gè)project,并且不希望影響其他project,或者被其他project影響,你可以直接打開(kāi)這個(gè)project而不是通過(guò)workspace,或者你也可將這個(gè)project添加到其他workspace中。一個(gè)project可以同時(shí)從屬于多個(gè)workspace,所以你可以在任意的組合中使用這個(gè)project,而不需要去重新配置project或者workspace。
你可以使用workspace中默認(rèn)的編譯目錄,也可以自己指定一個(gè)。注意,如果你為一個(gè)project指定了一個(gè)編譯目錄,那么當(dāng)你編譯這個(gè)project時(shí),這個(gè)目錄會(huì)被此project所屬的任何workspace的編譯目錄所覆蓋。
scheme
譯自apple 官方文檔中的 Xcode Scheme
scheme定義了可以用于編譯若干target,以及編譯這些target時(shí)的一些配置和要執(zhí)行的測(cè)試。我們可以定義多個(gè)scheme,但是每次只能使用其中一個(gè)。我們可以設(shè)置scheme保存在project中還是workspace中。如果保存在project中,那么任意包含了這個(gè)project的workspace都可以使用。如果保存在workspace中,那么只有這個(gè)workspace可以使用。選擇了scheme就意味著選擇了運(yùn)行目標(biāo)。