前言
workspace、project、target、scheme
,這些基本概念非常容易混淆,特別是經常使用Xcode編譯和打包的開發者,往往會忽視這些基礎知識。
最近開始用xcodebuild
,Xcode的可視化操作帶來的便利就是對命令行的生疏,特寫一篇文章來回顧下。
workspace、project、target和scheme
了解這四個基本概念,有利于理解用命令行編譯的參數設置。
- project是基本工程,包含了所有的代碼文件和資源文件、以及基本的編譯相關設置。project可以單獨存在,也可以被包含在workspace。
- workspace是project的管理文件,一個workspace可以包含多個project,同個workspace內的project之間可以引用。
- target是編譯目標,target會繼承project的基本設置,并重新設置target相關的編譯信息(主要是Build Settings 和 Build Phases)。
一個target對應一個product,一個工程里可以有多個target。target之間可以存在依賴,如果targetA依賴targetB,那么編譯targetA的時候會先編譯targetB。多個target只能有一個處于active狀態,由Xcode的scheme決定。
如下圖,圓圈所在就是編譯目標,有兩個target,分別是產生product和測試相關,其中的LearnAnimationTests
就是依賴LearnAnimation
。
scheme和target - scheme是編譯任務,配置了
Build、Run、Test、Profile、Analyze、Archive
相關的信息(見下圖),同時可以指定運行的目標(如圖中是iPhone 7 Plus)
我們可以定義多個scheme,但是只能使用一個。
.app .xcarchive 和 .ipa的區別
這三個文件都是Xcode直接產出的運行相關文件,通過指令同樣可以生成這三個文件。
-
.xcarchive 是通過Xcode打包或者 xcodebuild archive打包出來的文件,里面包括了.app文件、dSYM符號文件等;
-
.ipa 是一個zip壓縮包,主要有Payload文件夾,里面有.app文件,Symbols是符號文件;
-
.app 程序運行包,其中包括二進制的可執行文件以及運行所需要的資源以及plist,還有就是簽名文件和privisioning file;
命令行編譯
xcodebuild是命令行構建工具,接下來嘗試用xcodebuild產生上面所說的.app、.xcarchive 和 .ipa文件。(蘋果文檔,通過在命令行輸入man xcodebuild同樣可以看到)
1、產生.app文件
如果工程設置的Mach-O Type設置是Executable,編譯產生的就會是.app文件。
例如,我們使用Debug
的configuration
設置來編譯Live
的target
,命令是xcodebuild -target Live -configuration Debug
,結果如下:
類似,如果使用
Release
也可以產生.app文件,命令是:xcodebuild -target Live -configuration Release
,結果如下2、產生.xcarchive文件
xcodebuild的archive
動作(action)可以產生.xcarchive文件,下面是一個普通的archive
指令:
xcodebuild archive -project "LearnAnimation.xcodeproj" -scheme "LearnAnimation" -configuration Release -archivePath archive/learn.xcarchive
3、產生.ipa文件
xcodebuild的-exportArchive
參數可以用來打包.ipa文件,下面是一個普通的打包指令:
xcodebuild -exportArchive -archivePath archive/learn.xcarchive -exportPath App -exportProvisioningProfile "provisioning file name"
擴展內容
1、命令行修改plist參數
PlistBuddy支持修改plist,下面是一個修改指令:
/usr/libexec/PlistBuddy -c "Set :TestVersion ${TestVersion}" ${infoplist_path}
${infoplist_path} 替換為自己的plist的路徑。
PlistBuddy簡單使用,簡書上也有詳細介紹的文章。
2、編譯project工程和xcworkspace工程的區別
xcodebuild編譯project,可添加-project projectName
參數,也可以不添加
xcodebuild編譯xcworkspace,需要添加-workspace workspaceName
參數
如果對于缺省的參數,xcodebuild會優先使用xcode工程內的設置,再使用默認值。
3、xcodebuild編譯報錯library not found
ld: library not found for -lAFNetworking
clang: error: linker command failed with exit code 1 (use -v to see invocation)
報錯是鏈接時AFNetworking找不到,檢查工程設置中是否有引入AFNetworking;如果工程設置正常,那么檢查AFNetworking是否為pod方式引入,如果是則xcodebuild的目標需要是xcworkspace
。
4、蒲公英上傳ipa指令
打包出來的ipa配合下面的上傳指令,可以把ipa包直接發到蒲公英上。
curl -F "file=@Live.ipa" -F "uKey=key12345" -F "_api_key=key54321" http://www.pgyer.com/apiv1/app/upload
總結
在真機的代碼覆蓋率測試的背景驅動下,我強行對Xcode基礎知識進行一遍回顧,同時也要復習bash腳本語言,然后用xcodebuild對以前的工程進行編譯、打包,加深理解。
如果再有必要,搭建自動化構建的環境,應該不是難題。