2000年Matin Fowler發(fā)表文章Continuous Integration【1】,;2007年,Paul Duvall, Steve Matyas和 Andrew Glover合著的《Continuous Integration:Improving Software Quality and Reducing Risk》 【2】出版發(fā)行,,該書獲得了2008年的圖靈大獎,。持續(xù)集成理念經(jīng)過10多年的發(fā)展,已經(jīng)成為了業(yè)界的標(biāo)準(zhǔn),。在Java,, Ruby的世界已經(jīng)誕生了非常成熟的持續(xù)集成工具和實(shí)踐,而對于iOS領(lǐng)域來說,,因?yàn)榧夹g(shù)本身相對比較年輕和蘋果與生俱來的封閉思想,,在持續(xù)集成方面的發(fā)展相對滯后一些,但是,,隨著越來越多的iOS開發(fā)者的涌入,,以及各個互聯(lián)網(wǎng)巨頭加大對iOS開發(fā)的投入,,誕生了一大批非常好用的持續(xù)集成工具和服務(wù),,本文的目的就是介紹一下如何有效的利用這些類庫,服務(wù)快速構(gòu)建一個iOS開發(fā)環(huán)境下的持續(xù)集成平臺,。 自動化構(gòu)建在MartinFowler的文章[1]中關(guān)于自動化的構(gòu)建定義如下: Anyone should be able to bring in a virgin machine, check the sources
out of the repository, issue a single command, and have a running
system on their machine.
因此,,自動化構(gòu)建的的首要前提是有一個支持自動化構(gòu)建的命令行工具,可以讓開發(fā)人員可以通過一個簡單的命令運(yùn)行當(dāng)前項(xiàng)目,。 命令行工具自動化構(gòu)建的命令行工具比持續(xù)集成的概念要誕生得早很多,,幾十年前,Unix世界就已經(jīng)有了Make,,而Java世界有Ant,,Maven,以及當(dāng)前最流行的Gradle,,.Net世界則有Nant和MSBuild,。作為以GUI和命令行操作結(jié)合的完美性著稱的蘋果公司來說,,當(dāng)然也不會忘記為自己的封閉的iOS系統(tǒng)提供開發(fā)環(huán)境下命令行編譯工具:xcodebuild【3】 xcodebuild在介紹xcodebuild之前,需要先弄清楚一些在XCode環(huán)境下的一些概念【4】:
弄清楚上面的這些概念之后,,xcodebuild就很好理解了,官網(wǎng)上對其作用的描述如下: xcodebuild builds one or more targets contained in an Xcode
project, or builds a scheme contained in an Xcode workspace or
Xcode project.
xcodebuild就是用了構(gòu)建產(chǎn)品的命令行工具,,其用法可以歸結(jié)為3個部分:
可以構(gòu)建的對象有,,默認(rèn)情況下會運(yùn)行project下的第一個target:
構(gòu)建行為包括:
輔助命令包括:
關(guān)于xcodebuild更多詳細(xì)的命令行請參見:https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html 下圖是使用XcodeBuild運(yùn)行一個scheme的build的結(jié)果: 了解了xcodebuild的用法之后,,接下來分析一下xcodebuild的主要缺陷:
對于上面提到的缺陷,,F(xiàn)acebook給出了他們的解決方案:xctool【6】 xctoolxctool在 其主頁直接表明了其目的: 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,目的是讓構(gòu)建和測試更加容易,,更好的支持持續(xù)集成,。從個人感受來看,它的確成功取代了xcodebuild,。但是xctool說到底只是對xcodebuild的一個封裝,,只是提供了更加豐富的build指令,因此,,使用xctool的前提是xcodebuild已經(jīng)存在,,且能正常工作。 安裝xctool的安裝非常簡單,,只需要clone xctool的repository到項(xiàng)目根目錄就可以使用,, 如果你的機(jī)器上安裝有Homebrew,可以通過“brew install xctool”命令直接安裝,。(注意:使用xctool前一定要首先確認(rèn)xcodebuild已安裝且能正確工作),。 用法關(guān)于xctool的用法就更加人性化了,,幾乎可以重用所有的xcodebuild的指令,,配置。只需要注意一下幾點(diǎn):
例子: path/to/xctool.sh
-workspaceYourWorkspace.xcworkspace
-schemeYourScheme
test -only SomeTestTarget:SomeTestClass/testSomeMethod
下圖是我使用xctool運(yùn)行test的效果: 常見問題:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=armv7 armv7s). 解決方法:到Project Setting中,,把'Build Active Architecture Only'設(shè)置為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。 依賴管理選定了命令行工具之后, 接下來可以考慮下依賴管理的問題了,。我到現(xiàn)在還記得幾年前,,剛從Ant轉(zhuǎn)到使用Maven的那種爽快的感覺。后來,,進(jìn)入Ruby的世界,,其與生俱來的Gem管理系統(tǒng),也讓其依賴管理變得極其簡單,。 對于iOS平臺來說,,在做項(xiàng)目時,經(jīng)常需要使用到各種各樣的第三方Framework,,這同樣需要一個爽快的依賴管理系統(tǒng),,不然的話,各位可以想象一下重復(fù)的下載Framework文件,,拖入各個Target的Build Phase的Link Binary With Libraries中的場景,。這種重復(fù)的勞動對于“懶惰”的程序員來說,是很難接受的,,于是,,活躍的社區(qū)開發(fā)者們提供了這樣的一個工具:Cocoapods【7】 Cocoapods開始于2011年8月12日,經(jīng)過2年多的發(fā)展,,現(xiàn)在已經(jīng)超過2500次提交,,并且持續(xù)保持活躍更新,目前已成為iOS領(lǐng)域最流行的第三方依賴管理工具,。從技術(shù)層面來說,,其是一個Ruby Gem,從功能層面來說,,其是一個iOS平臺下的依賴管理工具,,為iOS項(xiàng)目開發(fā)提供了類似于在Ruby世界使用Gem的依賴管理體驗(yàn)。 安裝前面提到cocoapods本質(zhì)上是一個Ruby Gem,,因此,,其使用前提首先是Ruby開發(fā)環(huán)境。慶幸的是,,Mac下都自帶Ruby,。這樣,只需要簡單的2條命令,,就可以把cocoapods安裝好: $ [sudo] gem install cocoapods
$ pod setup
用法cocoapods的使用方式和使用Ruby Gem非常相似,,首先需要在項(xiàng)目根目錄下創(chuàng)建文件Podfile,在Podfile中,開發(fā)人員只需要按照規(guī)則配置好如下內(nèi)容就好:
例子: platform :ios, '6.0'
inhibit_all_warnings!
xcodeproj `MyProject`
pod 'ObjectiveSugar', '~> 0.5'
target :test do
pod 'OCMock', '~> 2.0.1'
end
post_install do |installer|
installer.project.targets.each do |target|
puts '#{target.name}'
end
end
修改好配置文件之后,,只需要簡單的使用“pod install”即可安裝好所有的依賴,,執(zhí)行該命令之后,在項(xiàng)目跟目錄下會出現(xiàn)“.xcworkspace”和“Pods”兩個目錄: 接下來,,開發(fā)者需要使用xcworkspace打開項(xiàng)目而不是使用xcodeproject,,打開項(xiàng)目之后,在項(xiàng)目目錄下除了自己的project以外,,還可以看到一個叫做Pods的項(xiàng)目,,該項(xiàng)目會為每一個依賴創(chuàng)建一個target: 在Podfile中,還可以指定依賴專屬于某個Target,, target :CocoaPodsTest do
pod 'OCMock', '~> 2.0.1'
pod 'OCHamcrest'
end
如果你記不清楚某個依賴庫的名稱,,可以使用“pod search <name>”模糊搜索依賴庫中的相似庫,另外,如果你想使用的庫在cocoapods的中央庫中找不到,,那么,,你可以考慮為開源社區(qū)做做貢獻(xiàn),把你覺得好用的庫添加到中央庫中,,Cocoapods的官網(wǎng)上有具體的步驟【8】 原理CocoaPods的原理思想基本上來自于Jonah Williams的博客“Using Open Source Static Libraries in Xcode 4”【9】,當(dāng)使用“pod install”安裝文件時,,cocoapods做了如下這些事:
注意事項(xiàng)當(dāng)使用xctool作為命令行工具構(gòu)建項(xiàng)目時,,使用cocoapods管理依賴時,需要做一些額外的配置:
感謝張凱峰對本文的審校。 給InfoQ中文站投稿或者參與內(nèi)容翻譯工作,,請郵件至editors@cn.,。也歡迎大家通過新浪微博(@InfoQ)或者騰訊微博(@InfoQ)關(guān)注我們,并與我們的編輯和其他讀者朋友交流,。 |
|