久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

構(gòu)建iOS持續(xù)集成平臺(一)——自動化構(gòu)建和依賴管理

 落寞風(fēng)吹雨 2016-09-12

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】:

  • Workspace:簡單來說,,Workspace就是一個容器,,在該容器中可以存放多個你創(chuàng)建的Xcode Project, 以及其他的項(xiàng)目中需要使用到的文件,。使用Workspace的好處有,,1),擴(kuò)展項(xiàng)目的可視域,即可以在多個項(xiàng)目之間跳轉(zhuǎn),,重構(gòu),,一個項(xiàng)目可以使用另一個項(xiàng)目的輸出。Workspace會負(fù)責(zé)各個Project之間提供各種相互依賴的關(guān)系;2),多個項(xiàng)目之間共享Build目錄,。
  • Project:指一個項(xiàng)目,,該項(xiàng)目會負(fù)責(zé)管理生成一個或者多個軟件產(chǎn)品的全部文件和配置,一個Project可以包含多個Target,。
  • Target:一個Target是指在一個Project中構(gòu)建的一個產(chǎn)品,,它包含了構(gòu)建該產(chǎn)品的所有文件,以及如何構(gòu)建該產(chǎn)品的配置,。
  • Scheme:一個定義好構(gòu)建過程的Target成為一個Scheme,。可在Scheme中定義的Target的構(gòu)建過程有:Build/Run/Test/Profile/Analyze/Archive
  • BuildSetting:配置產(chǎn)品的Build設(shè)置,,比方說,,使用哪個Architectures?使用哪個版本的SDK,?,。在Xcode Project中,有Project級別的Build Setting,,也有Target級別的Build Setting,。Build一個產(chǎn)品時一定是針對某個Target的,因此,,XCode中總是優(yōu)先選擇Target的Build Setting,,如果Target沒有配置,則會使用Project的Build Setting,。

弄清楚上面的這些概念之后,,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)建的對象
  • 構(gòu)建行為
  • 一些其他的輔助命令

可以構(gòu)建的對象有,,默認(rèn)情況下會運(yùn)行project下的第一個target:

  • workspace:必須和“-scheme”一起使用,構(gòu)建該workspace下的一個scheme,。
  • project:當(dāng)根目錄下有多個Project的時候,,必須使用“-project”指定project,,然后會運(yùn)行
  • target:構(gòu)建某個Target
  • scheme:和“-workspace”一起使用,指定構(gòu)建的scheme,。
  • ……

構(gòu)建行為包括:

  • clean:清除build目錄下的
  • build: 構(gòu)建
  • test: 測試某個scheme,,必須和'-scheme'一起使用
  • archive:打包,必須和“-scheme”一起使用
  • ……

輔助命令包括:

  • -sdk:指定構(gòu)建使用的SDK
  • -list:列出當(dāng)前項(xiàng)目下所有的Target和scheme,。
  • -version:版本信息
  • …...

關(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的主要缺陷:

  • 從上圖直接可以得到的感覺,其腳本輸出的可讀性極差,,
  • 只能要么完整的運(yùn)行一個target或者scheme,,要么全部不運(yùn)行。不能指定運(yùn)行Target中特定的測試,。
  • 最令人發(fā)指的是,,XCode 4中的xcodebuild居然不支持iOSUnitTest的Target【5】,當(dāng)我嘗試運(yùn)行一個iOS App的測試target時,,得到如下的錯誤:

對于上面提到的缺陷,,F(xiàn)acebook給出了他們的解決方案:xctool【6】

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,目的是讓構(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):

  • xctool不支持target構(gòu)建,,只能使用scheme構(gòu)建,。
  • 支持“-only”指令運(yùn)行指定的測試。
  • 支持多種格式的build報告,。

例子:

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)容就好:

  • 項(xiàng)目支持的平臺,版本(iOS/OSX)
  • 每個target的第三方依賴

例子:

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做了如下這些事:

  • 創(chuàng)建或者更新當(dāng)前的workspace
  • 創(chuàng)建一個新的項(xiàng)目來存放靜態(tài)庫
  • 把靜態(tài)庫會編譯生成的libpods.a文件配置到target的build phase的link with libraries中
  • 在依賴項(xiàng)目中創(chuàng)建*.xcconfig文件,指定在編譯時的一些參數(shù)和依賴
  • 添加一個新的名為“Copy Pods Resource”的Build Phase,該build phase會使用'${SRCROOT}/Pods/Pods-CocoaPodsTest-resources.sh'把Pods下的資源文件拷貝到app bundle下,。

注意事項(xiàng)

當(dāng)使用xctool作為命令行工具構(gòu)建項(xiàng)目時,,使用cocoapods管理依賴時,需要做一些額外的配置:

  • 編輯Scheme,,把pods靜態(tài)庫項(xiàng)目作為顯式的依賴添加到項(xiàng)目的build中,,
  • 把pods依賴項(xiàng)目拖動到本來的項(xiàng)目之上,表示先編譯pods靜態(tài)庫項(xiàng)目,,再編譯自己的項(xiàng)目,。


感謝張凱峰對本文的審校。

給InfoQ中文站投稿或者參與內(nèi)容翻譯工作,,請郵件至editors@cn.,。也歡迎大家通過新浪微博(@InfoQ)或者騰訊微博(@InfoQ)關(guān)注我們,并與我們的編輯和其他讀者朋友交流,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多