- iOS應(yīng)用程序使用Xcode進行編譯,打包的時候會接觸到
workspace,project,target與scheme這四個概念,下面我們來詳細介紹這四個概念;
Project
-
Project是基本工程,其包含了所有的代碼文件,.a或.framework靜態(tài)庫文件,資源文件,以及與編譯相關(guān)基礎(chǔ)設(shè)置; -
Project可以單獨存在,也可以被包含在Workspace中; - 一個
Project可以包含一個或者多個Target,在Project中設(shè)置的編譯選項Build Setting,可作用于所有的Target,每一個Target自己也單獨設(shè)置自己特殊的編譯配置,如下所示:
image.png

Target
-
Target是編譯的目標,其會繼承Project的編譯設(shè)置,并可重新設(shè)置自己的編譯配置,上面已經(jīng)有所闡述,編譯的配置主要是Build Setting與Build Phases - 一個
Target經(jīng)過編譯之后就只會生成一個對應(yīng)的Product; - 一個
Project可包含多個Target,Target之間可以相互依賴,如果這兩個target在同一個workspace中,Xcode就能識別這個依賴,這種依賴關(guān)系我們稱之為隱式依賴(implicit dependency) - 不同的target,經(jīng)過編譯生成的
Product類型也不同,常見的Product類型有.app,.a,.framework都隸屬于Mach-O文件,生成的Product類型與Target的編譯配置有關(guān),在Build Setting -> Mach-O Type中進行設(shè)置,舉例如下:
image.png


Worksapce
-
Worksapce顧名思義是工作空間,是Xcode的一種文件,可管理Project和其他文件,便于我們使用它; -
Worksapce可以包含多個Project,如下所示:
image.png -
Worksapce中的Project都共享一個編譯目錄,我們稱之為workspace build directory,那么每個Project之間的文件都是可以相互引用的,如果當前Worksapce中的Project都引用了同一個Library時,不需要給每個Project都拷貝一份; -
Worksapce中的每個Project依然是獨立的,不會影響到其他Project;
Scheme
Scheme也可看成編譯的配置文件,我們可以指定build(編譯),Run(運行),Test(測試),Profile(性能分析),analyze(語法分析),archive(打包)的配置選項,Scheme是針對Target的,一個Target可以設(shè)置多個不同的Scheme-
Xcode默認的
Scheme只有一個與Project同名;
image.png Xcode為
Scheme默認生成的配置選項Configuration有Debug與Release兩種,我們也可自定義新增Configuration,下面會有涉及到;我們可以自定義新的
Scheme,如下所示:




- 上述四種之前的關(guān)系可用下圖進行描述:

Xcode多環(huán)境配置
第一種方式:單scheme + 多configurations
-
新建一個項目命名為
ShellTest,并支持Cocoapods,然后配置info -> Configurations,添加新的環(huán)境配置,如下所示:
Snip20210918_10.png 其中
Debug與Release是Xcode默認的,Dev_Debug與Dev_Release是自定義新增的;-
這里配置完成后,由于使用了Cocoapods,要執(zhí)行一次
pod install,pods會自動去配置相關(guān)的環(huán)境,如下所示:
Snip20210918_11.png -
現(xiàn)在有四種
Configurations,如下所示:
image.png 配置預編譯宏,以此可用來設(shè)置不同scheme下的域名;


- 配置App的名稱



- 配置App的BundleID

- 配置AppIcon



- 依次選擇四種scheme,運行工程,最后會得到四個不同配置的App,如下所示:

第二種方式:多scheme + 多configurations
- 上述第一種方式
單scheme + 多configurations,每次運行都需要重新設(shè)置scheme的configurations選項,比較麻煩,下面建立所個scheme,然后讓設(shè)置每個scheme的configurations選項,在運行工程時,只要切換scheme即可;
image.png - 其他的配置與方式一相同;
第三種方式:多target
- 選中target -> YYTest 然后右擊選擇
Duplicate,會創(chuàng)建一個新的target;
image.png - 可更改新的target的名稱,plist文件名稱,以及對應(yīng)的scheme名稱為
YYTestBeta - 由于
YYTestBeta這個target是全新的,所有的配置都是全新的一份,我們可以單獨設(shè)置自己的配置選項;
第四種方式:xcconfig文件的使用
- 通過常見
. xcconfig文件來實現(xiàn)多環(huán)境的配置,注意每一個Configurations對應(yīng)一個. xcconfig文件; - 在新建工程
SFTest中創(chuàng)建三個. xcconfig文件,分別為CommonConfig.xcconfig,DebugConfig.xcconfig,ReleaseConfig.xcconfig,其中CommonConfig.xcconfig是公用的,可在DebugConfig.xcconfig,ReleaseConfig.xcconfig文件中以#include的形式導入;


- 然后在
Project -> info -> configurations中去設(shè)置.xcconfig文件,如下所示:

- 最后在工程中使用.xcconfig文件中自定義的key-value選項,如下所示:

工程運行之后,我們App的名稱就變成了
暢游;通過終端命令行,我們可以查看
Build Settings,如下:cd到工程目錄,然后執(zhí)行
xcodebuild -list
Information about project "SFTest":
Targets:
SFTest
Build Configurations:
Debug
Release
If no build configuration is specified and -scheme is not passed then "Release" is used.
Schemes:
SFTest
終端打印所有編譯配置Build Settings,執(zhí)行
xcodebuild -showBuildSettings將目標scheme
SFTest的編譯配置輸出成SFTestOut.xcconfig文件, 終端執(zhí)行xcodebuild -scheme "SFTest" -showBuildSettings >> SFTestOut.xcconfig將target ->
SFTest的編譯配置輸出成.txt文件,終端執(zhí)行xcodebuild -project SFTest.xcodeproj -target SFTest -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt

- 現(xiàn)在工程中引入
Cocoapods進行第三方庫的管理,執(zhí)行pod init與pod install終端出現(xiàn)警告,運行出現(xiàn)報錯,如下所示:


- cocoapods 也是使用
xcconfig來管理配置,可以看工程中 Pods 下面的 Targets Support Files 文件夾; - 引入了 pod 的項目,默認的 Configurations 為 pod 的 xcconfig;
- 為了不影響 pod 的使用,需要在
DebugConfig.xcconfig,ReleaseConfig.xcconfig中分別引入以下代碼,如下:

- 再次運行,運行成功!
常見的環(huán)境變量
-
$(TARGET_NAME):目標工程名稱 -
$(BUILD_PRODUCTS_DIR):編譯生成Product的路徑 -
$(SRCROOT):工程文件路徑,例如SFTest.xcodeproj -
$(CURRENT_PROJECT_VERSION):當前工程的版本號








