Xcode中的 workspace, project, target, scheme

發表於2016-10-10

最近在做SDK相容性測試發現一個問題,就是編譯出來的SDK,在iOS8以下的系統中不能用。查了下,發現是編譯設定錯了,雖然我target設定的是支援iOS6以上的,但是工程設定的還是iOS8以上。xib檔案編譯的版本是根據project設定,而不是target,這個也是為什麼在低於iOS8中不能用的原因。正好之前對SDK開發進行了工程拆分和重組,也使用了workspace,順便也瞭解了些編譯相關的東西。

Xcode Project

Xcode中的 project裡面包含了所有的原始檔,資原始檔和構建一個或者多個product的資訊。project利用他們去編譯我們所需的product,也幫我們組織它們之間的關係。一個project可以包含一個或者多個target。project定義了一些基本的編譯設定,每個target都繼承了project的預設設定,每個target可以通過重新設定target的編譯選項來定義自己的特殊編譯選項。

project包含了以下資訊:

  • 原始檔
    • 程式碼的標頭檔案和實現檔案
    • 靜態庫,動態庫,
    • 資原始檔(如文字,xml,plist等)
    • 圖片資源
    • 介面資原始檔(xib, storyboard等)
  • 在檔案結構的導航中,採用group去組織檔案(實際開發中,儘量使用實體資料夾)
  • project的編譯級別配置檔案如(debug, release)
  • target
  • 執行環境如:debug,test

project可以單獨存在,或者存在於一個workspace中。

target

target定義了構造一個product所需的檔案和編譯指令。一個target對應於一個product。target說白了就是
告訴編譯系統要編譯的檔案和編譯設定。編譯指令就是根據build settings and build phases來確定的。

target之間可以進行依賴。如果一個target的編譯需要另外一個target作為他的輸入,那麼我們就可以說前者依賴於後者。如果這兩個target在同一個workspace裡面,Xcode可以發現他們的依賴關係,這種依賴稱之為隱式依賴。當然你可以通過設定,明確他們的依賴關係。

workspace

workspace是Xcode的一種檔案,用來管理工程和裡面的檔案,一個workspace可以包含若干個工程,甚至可以新增任何你想新增的檔案。workspace提供了工程和工程裡面的target之間隱式和顯式依賴
關係,用來管理和組織工程裡面的所有檔案。

workspace中的工程共享一個編譯目錄

workspace中的工程預設都是在同一個編譯目錄下,也就是workspace的編譯目錄。由於每個工程中的檔案都在workspace的編譯目錄下,所以每個工程之間的檔案都是相互可以引用的。因此,如果workspace中的多個工程使用了同一個庫的時候,我們就不需要給每個工程都拷貝一個。

Xcode會檢查編譯目錄裡面的所有檔案去發現隱式的依賴關係。比如,一個工程用來編譯成庫給其他工程去引用,Xcode可以自動的先編譯這個工程的庫,然後再去編譯其他的工程。雖然你沒有在編譯選項裡面去設定這些依賴關係。當然如果你真的需要的話,你也可以去設定,提供一個顯式的編譯依賴關係。

workspace中每個工程依然都是獨立的。如果你想單獨的使用這個工程,並且不希望影響其他工程,或者被其他工程影響,你可以直接開啟工程而不通過workspace。一個工程可以被多個workspace所擁有,在任意的組合中依然可以直接執行,而不需要去重新配置工程或者workspace。

Xcode Scheme

scheme定義了編譯集合中的若干target,編譯時的一些設定以及要執行的測試集合。我們可以定義多個scheme,但是每次只能使用其中一個。我們可以設定scheme儲存在project中還是workspace中。如果儲存在project中,那麼任意包含了這個工程的workspace都可以使用。如果儲存在workspace中,那麼只有這個workspace可以使用。

參考:官方文件

相關文章