iOS系統提供開發環境下命令行編譯工具:xcodebuild【3】
xcodebuild
在介紹xcodebuild之前,需要先弄清楚一些在XCode環境下的一些概念【4】:
- Workspace:簡單來說,Workspace就是一個容器,在該容器中可以存放多個你創建的Xcode Project, 以及其他的項目中需要使用到的文件。
使用Workspace的好處有:
1),擴展項目的可視域,即可以在多個項目之間跳轉,重構,一個項目可以使用另一個項目的輸出。Workspace會負責各個Project之間提供各種相互依賴的關系;
2),多個項目之間共享Build目錄。
- Project:指一個項目,該項目會負責管理生成一個或者多個軟件產品的全部文件和配置,一個Project可以包含多個Target。
- Target:一個Target是指在一個Project中構建的一個產品,它包含了構建該產品的所有文件,以及如何構建該產品的配置。
- Scheme:一個定義好構建過程的Target成為一個Scheme。可在Scheme中定義的Target的構建過程有:Build/Run/Test/Profile/Analyze/Archive
- BuildSetting:配置產品的Build設置,比方說,使用哪個Architectures?使用哪個版本的SDK?。在Xcode Project中,有Project級別的Build Setting,也有Target級別的Build Setting。Build一個產品時一定是針對某個Target的,因此,XCode中總是優先選擇Target的Build Setting,如果Target沒有配置,則會使用Project的Build Setting。
弄清楚上面的這些概念之后,xcodebuild就很好理解了,官網上對其作用的描述如下:
xcodebuild builds one or more targets contained in an Xcode project, or builds a scheme contained in an Xcode workspace or Xcode project.
xcodebuild就是用了構建產品的命令行工具,其用法可以歸結為3個部分:
- 可構建的對象
- 構建行為
- 一些其他的輔助命令
可以構建的對象有,默認情況下會運行project下的第一個target:
- workspace:必須和“-scheme”一起使用,構建該workspace下的一個scheme。
- project:當根目錄下有多個Project的時候,必須使用“-project”指定project,然后會運行
- target:構建某個Target
- scheme:和“-workspace”一起使用,指定構建的scheme。
- ……
構建行為包括:
- clean:清除build目錄下的
- build: 構建
- test: 測試某個scheme,必須和"-scheme"一起使用
- archive:打包,必須和“-scheme”一起使用
- ……
輔助命令包括:
- -sdk:指定構建使用的SDK
- -list:列出當前項目下所有的Target和scheme。
- -version:版本信息
- …...
關於xcodebuild更多詳細的命令行請參見:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html
下圖是使用XcodeBuild運行一個scheme的build的結果:

了解了xcodebuild的用法之后,接下來分析一下xcodebuild的主要缺陷:
- 從上圖直接可以得到的感覺,其腳本輸出的可讀性極差,
- 只能要么完整的運行一個target或者scheme,要么全部不運行。不能指定運行Target中特定的測試。
- 最令人發指的是,XCode 4中的xcodebuild居然不支持iOSUnitTest的Target【5】,當我嘗試運行一個iOS App的測試target時,得到如下的錯誤:

對於上面提到的缺陷,Facebook給出了他們的解決方案:xctool:
xctool
xctool在 其主頁直接表明了其目的:
xctool is a replacement for Apple's xcodebuild that makes it easier to build and test iOS and Mac products. It's especially helpful for continuous integration.
其作用是替代xcodebuild,目的是讓構建和測試更加容易,更好的支持持續集成。從個人感受來看,它的確成功取代了xcodebuild。但是xctool說到底只是對xcodebuild的一個封裝,只是提供了更加豐富的build指令,因此,使用xctool的前提是xcodebuild已經存在,且能正常工作。
安裝
xctool的安裝非常簡單,只需要clone xctool的repository到項目根目錄就可以使用, 如果你的機器上安裝有Homebrew,可以通過“brew install xctool”命令直接安裝。(注意:使用xctool前一定要首先確認xcodebuild已安裝且能正確工作)。
用法
關於xctool的用法就更加人性化了,幾乎可以重用所有的xcodebuild的指令,配置。只需要注意一下幾點:
- xctool不支持target構建,只能使用scheme構建。
- 支持“-only”指令運行指定的測試。
- 支持多種格式的build報告。
例子:
path/to/xctool.sh -workspace YourWorkspace.xcworkspace -scheme YourSchemetest -only SomeTestTarget:SomeTestClass/testSomeMethod
下圖是我使用xctool運行test的效果:

常見問題:
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=armv7 armv7s).
解決方法:到Project Setting中,把"Build Active Architecture Only"設置為NO
Code Sign error: A valid provisioning profile matching the application's Identifier 'dk.muncken.MyApp' could not be found
解決方法:通過“-sdkiphonesimulator”指定SDK,從而能夠使用符合iOS約定的application Identifier。
