XCode工程中 Project 和 Targets區別

轉自:http://blog.csdn.net/zhaozy55555/article/details/8557175app

project就是一個項目,或者說工程,一個project能夠對應多個target,好比一個xxx遊戲的project,有free版的target,收費版的,或者還有什麼節日版,product就是target build出來的一個app 測試

targets之間沒一毛錢關係。但target和project有關係,target的setting會從project settings中繼承一部分優化

XCode工程中 Targets講解是本文要介紹的內容,相信不少人都注意到XCode中, 有個Target的概念. 這在不少地方都有所體現, 好比打開一個工程後, 左側的列表中有Targets一項, 而在工程界面的頂部菜單中, project裏面也有多個涉及到Target的項目, 那麼這個Target究竟是什麼呢? ui

Apple的人是這樣說的:「 Targets that define the products to build. A target organizes the files and instructions needed to build a product into a sequence of build actions that can be taken.」.net

簡單的理解的話, 能夠認爲一個target對應一個新的product(基於同一份代碼的狀況下). 但都一份代碼了, 弄個新product作啥呢? 折騰這個有意思麼?xml

其實這不是單純的瞎折騰, 雖然代碼是同一份, 但編譯設置(好比編譯條件), 以及包含的資源文件卻能夠有很大的差異. 因而即便同一份代碼, 產出的product也可能大不相同.blog

咱們來舉幾個典型的應用多Targets的狀況吧, 好比完整版和lite版; 好比同一個遊戲的20關, 30關, 50關版; 再或者好比同一個遊戲換些資源和名字就當新遊戲賣的(喂喂, 你在教些什麼...)繼承

Targets之間, 什麼相同, 什麼不一樣遊戲

既然是利用同一份代碼產出不一樣的product, 那麼到底不一樣Target之間存在着什麼樣的差別呢?資源

要解釋這個問題, 咱們就要來看看一個Target指定了哪些內容.

從XCode左側的列表中, 咱們能夠看到一個Target包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries. 其中

Copy Bundle Resources 是指生成的product的.app內將包含哪些資源文件

Compile Sources 是指將有哪些源代碼被編譯

Link Binary With Libraries 是指編譯過程當中會引用哪些庫文件

經過Copy Bundle Resources中內容的不一樣設置, 咱們可讓不一樣的product包含不一樣的資源, 包括程序的主圖標等, 而不是把XCode的工程中列出的資源一股腦的包含進去.

而這還不是一個target所指定的所有內容. 每一個target可使用一個獨立, 不一樣的Info.plist文件. 

咱們都知道, 這個Info.plist文件內定義了一個iPhone項目的不少關鍵性內容, 好比程序名稱, 最終生成product的全局惟一id等等.
    
並且不一樣的target還能夠定義完整的差別化的編譯設置, 從簡單的調整優化選項, 到增長條件編譯所使用的編譯條件, 以致於所使用的base SDK均可以差別化指定.

建立第二個Target

爲何是第二個? 由於第一個就是建立好工程後的默認Target呀! (廢話這麼多, 拖走...)

建立target有多種方法, 咱們能夠從現有的target上覆製出一份, 而後略加改動, 也能夠徹底新建一個target出來. 但其實說穿了, 兩個方法大同小異

首先咱們來看看利用複製的方法建立target

利用複製建立target

咱們在XCode左側的列表中, 展開 Targets 項, 在現有的target上, 右鍵選擇 "Duplicate", 或者選中現有target後, 在頂部菜單的Edit內選擇"Duplicate"也能夠.

此時咱們就獲得了一個新的target, 而在Resource裏面也會獲得一個 xxxx copy.plist. 這個新的target與原有的target是徹底一致的, 餘下的就是一些差別化的修改, 這個咱們後面再說

建立全新的target

相似複製的方法, 咱們能夠在左側的列表中不少地方按下右鍵菜單, 均可以看到Add中會有"New Target..."一項, 而在工程頂部菜單的Project內, 也能夠看到這個"New Target..."的身影.

點擊後, 首先會讓你選擇target的類型, 既然我一直所指的都是程序自己, 那麼天然選擇Application了(至於其餘的嘛, 有興趣的本身研究吧, 好比咱們能夠把程序中的部分提取成一個Static Library).

Next後, 會讓你輸入一個新的Target的名字, 而不像複製的方法中, 默認生成 xxxxx copy這樣的target名.

可是這樣生成出的Target幾乎是空的. Copy Bundle Resources, Compile Sources, Link Binary With Libraries裏面都沒有任何內容. 編譯設置也是徹底原始的狀態.

能夠經過拖拽內容到這些target的設置中, 以及調整編譯選項來完成Target的配置。

Target中部份內容的修改方法

其實這段的部份內容, 在非多Targets的工程中也可能會用獲得.

因爲修改基本都是在工程/編譯設置中完成, 所以沒有特殊狀況, 就再也不聲明瞭, 打開target對應的工程/編譯設置的方法能夠採用在該target上右鍵, 選擇get info來作到.

生成的product名稱的修改: Packing段內的Product Name一項

Info.plist文件名: Packing段內的Info.plist File一項, 好比複製出來的target以爲那個xxxxx copy.plist太傻就能夠在這裏改

條 件編譯: 增長一個User-Defined Setting(Target "xxxx" Info的build頁的左下角那個齒輪中能夠看到這個內容), 在Other C Flag裏面填入, 好比要定義一個叫作LITE_VERSION的define值, 咱們能夠寫上 "-DLITE_VERSION" 或 "-DLITE_VERSION=1". 那麼在程序中就能夠用

  1. #if defined(LITE_VERSION)   
  2. #else   
  3. #endif  

這樣的條件編譯來部分差別化代碼了

也許有些朋友記得我在代碼區貼過的檢測破解版的代碼, 其中有一種檢測方法就是看info.plist是文本仍是二進制的, 那麼咱們可否建議一個模擬破解的target, 直接生成文本的info.plist以便測試呢?

固然能夠, 在packing段內, 有一項叫"Info.plist Output Encoding", 默認值是Binary, 咱們只要選成xml, 那麼生成出的product.app內的info.plist就直接是文本樣式的了.

另外, 向Copy Bundle Resources, Compile Sources, Link Binary With Libraries內添加/刪除文件, 能夠在要改動的文件上, 選擇get info, 而且切換到Target頁, 勾選要引用這個文件的target便可. 好比icon.png能夠指定給默認target, 而icon_lite.png指定給lite verion的target

相關文章
相關標籤/搜索