IOS中Project、target、workspace、scheme的區(qū)別與聯(lián)系

  • iOS應(yīng)用程序使用Xcode進行編譯,打包的時候會接觸到workspace,project,targetscheme這四個概念,下面我們來詳細介紹這四個概念;

Project

  • Project是基本工程,其包含了所有的代碼文件,.a或.framework靜態(tài)庫文件,資源文件,以及與編譯相關(guān)基礎(chǔ)設(shè)置;
  • Project可以單獨存在,也可以被包含在Workspace中;
  • 一個Project可以包含一個或者多個Target,在Project中設(shè)置的編譯選項Build Setting,可作用于所有的Target,每一個Target自己也單獨設(shè)置自己特殊的編譯配置,如下所示:
    image.png
image.png

Target

  • Target是編譯的目標,其會繼承Project的編譯設(shè)置,并可重新設(shè)置自己的編譯配置,上面已經(jīng)有所闡述,編譯的配置主要是Build SettingBuild 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
image.png
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默認生成的配置選項ConfigurationDebugRelease兩種,我們也可自定義新增Configuration,下面會有涉及到;

  • 我們可以自定義新的Scheme,如下所示:

Snip20210922_30.png
Snip20210922_31.png
image.png
image.png
  • 上述四種之前的關(guān)系可用下圖進行描述:
image.png

Xcode多環(huán)境配置

第一種方式:單scheme + 多configurations
  • 新建一個項目命名為ShellTest,并支持Cocoapods,然后配置info -> Configurations,添加新的環(huán)境配置,如下所示:

    Snip20210918_10.png

  • 其中DebugRelease是Xcode默認的,Dev_DebugDev_Release是自定義新增的;

  • 這里配置完成后,由于使用了Cocoapods,要執(zhí)行一次pod install,pods會自動去配置相關(guān)的環(huán)境,如下所示:

    Snip20210918_11.png

  • 現(xiàn)在有四種Configurations,如下所示:

    image.png

  • 配置預編譯宏,以此可用來設(shè)置不同scheme下的域名;

Snip20210918_12.png
image.png
  • 配置App的名稱
image.png
Snip20210922_19.png
image.png
  • 配置App的BundleID
image.png
  • 配置AppIcon
image.png
image.png
image.png
  • 依次選擇四種scheme,運行工程,最后會得到四個不同配置的App,如下所示:
image.png
第二種方式:多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.xcconfigReleaseConfig.xcconfig,其中CommonConfig.xcconfig是公用的,可在DebugConfig.xcconfig,ReleaseConfig.xcconfig文件中以#include的形式導入;
Snip20210923_41.png
image.png
  • 然后在Project -> info -> configurations中去設(shè)置.xcconfig文件,如下所示:
Snip20210923_42.png
  • 最后在工程中使用.xcconfig文件中自定義的key-value選項,如下所示:
Snip20210923_44.png
  • 工程運行之后,我們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

  • 將目標schemeSFTest的編譯配置輸出成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

image.png
  • 現(xiàn)在工程中引入Cocoapods進行第三方庫的管理,執(zhí)行pod initpod install 終端出現(xiàn)警告,運行出現(xiàn)報錯,如下所示:
Snip20210923_45.png
Snip20210923_46.png
  • cocoapods 也是使用 xcconfig來管理配置,可以看工程中 Pods 下面的 Targets Support Files 文件夾;
  • 引入了 pod 的項目,默認的 Configurations 為 pod 的 xcconfig;
  • 為了不影響 pod 的使用,需要在DebugConfig.xcconfig,ReleaseConfig.xcconfig中分別引入以下代碼,如下:
Snip20210923_49.png
  • 再次運行,運行成功!
常見的環(huán)境變量
  • $(TARGET_NAME):目標工程名稱
  • $(BUILD_PRODUCTS_DIR):編譯生成Product的路徑
  • $(SRCROOT):工程文件路徑,例如SFTest.xcodeproj
  • $(CURRENT_PROJECT_VERSION):當前工程的版本號
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容