從最開始的原始播種工具與刀耕火種的開墾方式馆蠕,到現(xiàn)代化的機(jī)械農(nóng)機(jī)和水庫(kù)水壩構(gòu)建灌溉系統(tǒng),隨著工具的演化和基礎(chǔ)設(shè)施的發(fā)展的畴,農(nóng)業(yè)才能支持人類人口爆炸式的增長(zhǎng)末融。
挑戰(zhàn)在于工具和基礎(chǔ)設(shè)施的積累、通用性呜达。
日本從明朝引進(jìn)磨盤谣蠢,改變了面食不能加工的面貌。Ruby語(yǔ)言秉承Prel語(yǔ)言的精神查近,誕生了與CPAN(Prel擁有龐大的難以想象的第三方庫(kù)代碼眉踱,CPAN則是較早處理語(yǔ)言內(nèi)部代碼引用和依賴的包管理器)精髓一致的RubyGem,無(wú)數(shù)受到Unix文化熏陶的程序員??方便的將以前的社區(qū)積累的代碼庫(kù)與工具集轉(zhuǎn)移到讓他們感覺舒適的Ruby社區(qū)霜威,Ruby社區(qū)借助工具和基礎(chǔ)設(shè)施轉(zhuǎn)移的優(yōu)勢(shì)谈喳,Ruby on rails迅速成為最火熱的Web技術(shù)棧。在以前戈泼,Cocoa平臺(tái)的開發(fā)者像是最初使用Mac的小眾人群婿禽,隨著移動(dòng)互聯(lián)網(wǎng)時(shí)代的浪潮來(lái)臨,無(wú)數(shù)開發(fā)者開始關(guān)注并成為Cocoa平臺(tái)的開發(fā)者大猛,甚至有大量的開發(fā)者的職業(yè)生涯的第一個(gè)開發(fā)平臺(tái)就是Cocoa扭倾,當(dāng)然這個(gè)平臺(tái)上的優(yōu)秀開發(fā)者總是擁有其他平臺(tái)優(yōu)秀的開發(fā)經(jīng)驗(yàn)。
什么是工具鏈
什么叫做工具鏈挽绩,編寫程序需要使用編程語(yǔ)言膛壹,但是只有編程語(yǔ)言是不能產(chǎn)出實(shí)際的程序或應(yīng)用的。寫出了文本代碼得經(jīng)過編譯唉堪、鏈接模聋、加殼封裝成可執(zhí)行的文件最終發(fā)布才能夠運(yùn)行在設(shè)備上,開發(fā)環(huán)節(jié)同樣重要唠亚,開發(fā)的時(shí)候debug得需要調(diào)試器链方,語(yǔ)法要提示還有高亮,語(yǔ)法分析器和靜態(tài)分析器提供代碼掃描和分析的支持灶搜,引用系統(tǒng)框架或者是第三方庫(kù)祟蚀、項(xiàng)目復(fù)雜以后管理龐大數(shù)量的代碼,也需要使用庫(kù)管理工具或者是依賴管理工具去解決割卖。移動(dòng)軟件分發(fā)平臺(tái)一般都是應(yīng)用商店模式前酿,如果需要商業(yè)發(fā)布,發(fā)布也需要發(fā)布工具來(lái)完成安全和便捷的發(fā)布流程究珊。到此薪者,前面提到的纵苛,編譯器剿涮、鏈接工具言津、調(diào)試器、靜態(tài)分析器取试、包管理工具和發(fā)布工具等等算作是一門開發(fā)語(yǔ)言或者某一開發(fā)平臺(tái)的工具鏈悬槽,像是一根鏈條從開發(fā)、測(cè)試瞬浓、發(fā)布一整套流程下來(lái)需要參與的工具集初婆。可有人問猿棉,為啥我沒聽說(shuō)過呢磅叛?那是因?yàn)槟闶褂昧薞isual Studio或者是Xcode等等這樣的IDE,IDE其實(shí)已經(jīng)把這些工具標(biāo)準(zhǔn)化組織成一套完整的開發(fā)環(huán)境給開發(fā)者萨赁,這是商業(yè)開發(fā)平臺(tái)的好處弊琴,程序員不需要關(guān)心這些工具問題,但是對(duì)于開源界杖爽,你也總會(huì)聽說(shuō)過諸如GNU工具鏈敲董、Ruby on rails工具集等等,Unix巫師使用vim或者emacs開發(fā)慰安,用GCC編譯腋寨,用GDB調(diào)試,使用makefile來(lái)管理鏈接等等化焕,讓你覺得這一切都好流弊萄窜,本篇文章就粗略的介紹一下Cocoa平臺(tái)下的工具鏈。
展望Cocoa
隨著蘋果引導(dǎo)了移動(dòng)互聯(lián)網(wǎng)時(shí)代锣杂,Cocoa平臺(tái)的新鮮血液越來(lái)越充足脂倦,可這就像是一片貧瘠的土地,亟待開墾元莫,有經(jīng)驗(yàn)的開發(fā)者一邊逐步體味到iOS赖阻、MacOS這類類Unix系統(tǒng)的精髓,并深感由C類語(yǔ)言演化的Objective-C和與GCC一脈相承的Clang踱蠢、LLVM的偉大火欧,但同時(shí)也漸漸發(fā)現(xiàn),落后的代碼管理機(jī)制與C語(yǔ)言也一樣飽受詬病(靜態(tài)庫(kù)組織代碼與缺乏命名空間)茎截,開發(fā)者數(shù)目龐大卻缺乏成熟代碼管理工具與庫(kù)管理平臺(tái)苇侵,使用靜態(tài)庫(kù)與通過submodules來(lái)組織代碼效果也不甚理想,并不能解放開發(fā)者手動(dòng)檢查依賴關(guān)系企锌,相比于Java社區(qū)Ant榆浓、Maven、Gradle的發(fā)展撕攒,Ruby on rails的RubyGem陡鹃,哪怕是JavaScript的Npm與webpack等等烘浦,Cocoa的開發(fā)者工具甚至原始的有一些過分,Android開發(fā)社區(qū)借助Java的力量萍鲸,以intellij商業(yè)開發(fā)工具為基礎(chǔ)闷叉,發(fā)展出以Gradle、Android Studio等開發(fā)工具集脊阴,使得Java開發(fā)者能夠迅速的投入移動(dòng)應(yīng)用的開發(fā)握侧。相比之下,Cocoa平臺(tái)的開發(fā)者在面臨大規(guī)模開發(fā)時(shí)也逐漸暴露許多工程問題嘿期∑非妫“中國(guó)的造紙術(shù)傳入西方,給歐洲大陸帶來(lái)了文明备徐,從此才有了文藝復(fù)興”孽查。在這樣的情況下,在第一批轉(zhuǎn)入Cocoa移動(dòng)開發(fā)社區(qū)的開發(fā)者中坦喘,有一大部分來(lái)自Ruby社區(qū)的開發(fā)者盲再,其中Eloy Durán在2011年8月12日創(chuàng)建了CocoaPods,從而揭開第三方開源社區(qū)構(gòu)建Cocoa平臺(tái)下工具集的序曲瓣铣,CocoaPods已經(jīng)成為Cocoa平臺(tái)下答朋,第三方庫(kù)管理以及代碼管理的事實(shí)標(biāo)準(zhǔn),隨著Swift社區(qū)建立以及開源棠笑,這些已有的工具集又快速的遷移到新的社區(qū)梦碗,使得Swift的社區(qū)在短時(shí)間內(nèi)變得非常活躍且富有生機(jī)蓖救,隨著Swift Package Manager的發(fā)布洪规,至少屬于Apple的Swift開發(fā)團(tuán)隊(duì)開始注重這方面的問題,一切都在向好的方向發(fā)展循捺。
其實(shí)本篇文章是瞎扯淡
為什么這么說(shuō)斩例,因?yàn)閄code已經(jīng)提供了從編譯鏈接到發(fā)布的一切工具,既然能用為什么還要講這些从橘,不是在表演技術(shù)么念赶?還真不是,Xcode雖然好用恰力,但是有如下幾個(gè)小問題叉谜,第一是沒有很好地依賴管理工具,第二是構(gòu)建工具太復(fù)雜踩萎,第三是沒有比較好的發(fā)布工具停局,只有IDE的發(fā)布功能,最后并不能很好的打通這些工具。這有什么影響呢董栽?如果你一直在Xcode下工作履怯,所有的工作需求都是可以通過手動(dòng)操作被滿足的,但是項(xiàng)目規(guī)模一上來(lái)裆泳,諸多的第三方庫(kù)的管理、不停地構(gòu)建和打包分發(fā)給測(cè)試柠硕、發(fā)布到Appstore的時(shí)候總是出現(xiàn)這樣或者那樣的問題工禾,你需要進(jìn)行持續(xù)集成,但總是受制于Xcode蝗柔。
思考如下問題:
- 如何避免反復(fù)手動(dòng)給測(cè)試打包
- 如何避免反復(fù)手動(dòng)給測(cè)試機(jī)安裝測(cè)試版本App
- 當(dāng)出現(xiàn)大規(guī)模并行開發(fā)的時(shí)候闻葵,如何靈活構(gòu)建多種版本,配置多種構(gòu)建環(huán)境癣丧,方面測(cè)試能夠進(jìn)行線上常規(guī)測(cè)試槽畔、灰度發(fā)布測(cè)試、特性分支功能版本測(cè)試胁编、bug修復(fù)版本測(cè)試等等
- 當(dāng)出現(xiàn)多個(gè)版本的時(shí)候厢钧,如何對(duì)接bug跟蹤系統(tǒng)
- 團(tuán)隊(duì)開發(fā)人員數(shù)量爆發(fā),引入組件化方案后嬉橙,主工程如何管理各個(gè)發(fā)開團(tuán)隊(duì)負(fù)責(zé)的功能模塊
- 如何做到代碼版本控制工具->代碼審查合并->觸發(fā)構(gòu)建觸發(fā)器->配置構(gòu)建環(huán)境->構(gòu)建打包->分發(fā)測(cè)試
- 如何構(gòu)建私有代碼共享倉(cāng)庫(kù)
Cocoa平臺(tái)下的工具鏈
在工作中早直,個(gè)人覺得Cocoa平臺(tái)比較缺乏完整的商業(yè)工具鏈,但借助Ruby on rails社區(qū)的力量發(fā)展了一大批開源項(xiàng)目豐富了Cocoa平臺(tái)的工具鏈市框,至少包含如下幾項(xiàng):
- Xcodebuild
- oclint
- sonar
- bundle
- fastlane
- CocoaPods
- carthage
- shenzhen
xcodebuild
Xcodebuild屬于構(gòu)建工具霞扬,是Xcode構(gòu)建功能的命令行版本,官方的 Man-page
該命令行工具可以通過project文件或者是workspace文件枫振,指定target喻圃、scheme、buildconfiguration等等來(lái)進(jìn)行編譯粪滤,同時(shí)可以指定編譯后的文件輸出路徑等等斧拍,作為基礎(chǔ)的命令行工具,可以不適用Xcode工具進(jìn)行編譯打包等等杖小,xcrun又可以提供Xcode一系列完整的工具鏈調(diào)用饮焦,在實(shí)際開發(fā)過程中,有以下幾種使用情況:
- 編譯完整應(yīng)用的項(xiàng)目窍侧,進(jìn)行命令行構(gòu)建與打包县踢,成為持續(xù)集成的基礎(chǔ)工具,當(dāng)然也要求CI服務(wù)器必須是MacOS環(huán)境
- 如果代碼使用動(dòng)態(tài)庫(kù)或者靜態(tài)庫(kù)管理和組織伟件,團(tuán)隊(duì)內(nèi)部有這樣的共享代碼需求或者你從事的是SDK開發(fā)硼啤,可使用該工具進(jìn)行動(dòng)態(tài)配置,比如使用scheme與build configuration編譯斧账,同一套代碼可編譯出不同配置的代碼庫(kù)
- 編譯資源bundle工程谴返,如果項(xiàng)目?jī)?nèi)部的資源使用bundle進(jìn)行組織的煞肾,則使用該工具可以靈活控制資源bundle的產(chǎn)出,并與其他工具交互嗓袱,分發(fā)給不同的開發(fā)人員或項(xiàng)目
CocoaPods與Carthage依賴管理工具
準(zhǔn)確的來(lái)說(shuō)籍救, CocoaPods 與 Carthage 并不是完全同一類型的工具,CocoaPods涉及到第三方庫(kù)的管理渠抹、發(fā)布甚至帶有構(gòu)建中心代碼倉(cāng)庫(kù)的功能蝙昙,相比之下Carthage簡(jiǎn)簡(jiǎn)單單是第三方庫(kù)引用管理的工具,遠(yuǎn)遠(yuǎn)沒有CocoaPods強(qiáng)大梧却,但其去中心化與不破壞工程結(jié)構(gòu)的做法奇颠,使得應(yīng)付小型項(xiàng)目得心應(yīng)手。Podfile用以申明項(xiàng)目代碼相關(guān)性放航,Cocoapods用來(lái)處理各庫(kù)之間的依賴關(guān)系烈拒,可以自動(dòng)下載配置好所需要的庫(kù),即便是在管理自己書寫的代碼的相關(guān)系上广鳍,Cocoapods也是最好的選擇荆几,使用CocoaPods有如下情況:
- 管理工程中的第三方庫(kù)
- 管理團(tuán)隊(duì)開發(fā)代碼的相關(guān)性
- 將書寫的代碼復(fù)用,采取制作成Pod庫(kù)的形式赊时,引用其他模塊的代碼也是Pod庫(kù)伴郁,這樣可以通過Podfile管理內(nèi)部代碼依賴關(guān)系,從而避免庫(kù)沖突等等復(fù)雜問題
- 構(gòu)建組織內(nèi)部的代碼倉(cāng)庫(kù)蛋叼,用作組織內(nèi)部代碼發(fā)布焊傅、測(cè)試與共享管理
- 每個(gè)團(tuán)隊(duì)都把自己負(fù)責(zé)的模塊代碼以Pod形式提供,模塊內(nèi)代碼發(fā)生變化狈涮,則必須通過更新版本號(hào)發(fā)布新版本狐胎,主工程可以方面測(cè)試,一旦出現(xiàn)嚴(yán)重問題則可以回退到之前穩(wěn)定的版本歌馍,從而保證主工程的可壯性
oclint靜態(tài)分析工具
oclint是一個(gè)開源的靜態(tài)分析工具握巢,在MacOS中基于Clang進(jìn)行C、C++松却、Objective-C的靜態(tài)分析暴浦,目的在于可以發(fā)現(xiàn)代碼隱藏的問題和提高代碼質(zhì)量,如果公司沒有codeReview的習(xí)慣的話晓锻,經(jīng)常使用靜態(tài)分析可以稍微彌補(bǔ)一下歌焦,大體上oclint可以做到如下:
- 掃描隱形bug,諸如if else邏輯沒有完整砚哆,異常沒有處理等語(yǔ)句的分析
- 掃描沒有使用過的代碼独撇,包含未使用的變量和參數(shù)
- 掃描不符合設(shè)置的語(yǔ)法風(fēng)格,比如方法命名規(guī)范與代碼包裝邏輯規(guī)范等等
- 掃描復(fù)雜邏輯代碼,檢查是否有邏輯重疊或者檢查循環(huán)調(diào)用等
在Cocoa平臺(tái)下纷铣,組織持續(xù)集成卵史,實(shí)施持續(xù)交付的過程中,通過每次代碼提交入庫(kù)的時(shí)候搜立,進(jìn)行靜態(tài)分析掃描以躯,可以將質(zhì)量問題在交付測(cè)試之前就及時(shí)發(fā)現(xiàn),開發(fā)者可以使用這些工具提前將bug扼殺在搖籃中啄踊。比如忧设,在每次git代碼提交入庫(kù),從分支完成以后可以使用oclint進(jìn)行靜態(tài)分析社痛,生成html的代碼報(bào)告,可以設(shè)置質(zhì)量閾值來(lái)根據(jù)分析結(jié)果是否將提交回滾命雀,重新打回開發(fā)階段蒜哀。
shenzhen與fastlane構(gòu)建工具
![](https://fastlane.tools/assets/img/intro-fastlane-tree.png)
shenzhen是一個(gè)使用Xcode API的命令行構(gòu)建工具,fastlane則是一套兼容Android與iOS移動(dòng)端的持續(xù)集成工具集吏砂,相比于shenzhen撵儿,構(gòu)建工具只是fastlane中一個(gè)非常小的子集。fastlane有如下幾個(gè)套件:
- scan插件狐血,用以運(yùn)行單元測(cè)試代碼淀歇,在構(gòu)建之前通過單元測(cè)試再開始進(jìn)行構(gòu)建,這對(duì)于模塊代碼的穩(wěn)定性至關(guān)重要匈织,也許一些開發(fā)者會(huì)比較喜歡Mock測(cè)試浪默,但面對(duì)UI測(cè)試和邏輯單元測(cè)試,使用UITest與XCTestCase則會(huì)更加有效缀匕,scan則可以與這些測(cè)試框架進(jìn)行交互纳决,并生成測(cè)試報(bào)告
- pilot插件,用以綁定測(cè)試分發(fā)服務(wù)乡小,比如iOS構(gòu)建的版本可以通過它推送到testFlight阔加,測(cè)試設(shè)備就可以自動(dòng)獲得測(cè)試版本
- gym插件,用以替代shenzhen满钟,可以構(gòu)建打包應(yīng)用
- deliver插件胜榔,可以用以發(fā)布應(yīng)用到AppStore
- 還有諸如cert管理證書和配置文件,snapshot管理上傳到AppStore的截圖湃番,pem管理推送配置文件夭织,produce通過命令行與iTunes Connect進(jìn)行交互,match用以管理和同步配置文件和證書
fastlane這樣的構(gòu)建工具已經(jīng)比較完整的覆蓋了Cocoa平臺(tái)下有關(guān)移動(dòng)開發(fā)的工具范圍
SonarQube
SonarQube是一個(gè)代碼質(zhì)量管理的開源平臺(tái)吠撮,可用于搭建代碼質(zhì)量管理服務(wù)器摔癣,通過在服務(wù)器上構(gòu)建應(yīng)用,運(yùn)行代碼靜態(tài)分析偵測(cè)代碼質(zhì)量、運(yùn)行單元測(cè)試進(jìn)行全面的回歸測(cè)試择浊、搜索重復(fù)代碼戴卜、評(píng)估單元測(cè)試覆蓋率、通過設(shè)置代碼規(guī)范檢測(cè)代碼風(fēng)格琢岩、檢索注釋評(píng)估代碼閱讀性投剥、發(fā)現(xiàn)潛在的bug生成評(píng)估報(bào)告。
其實(shí)該平臺(tái)本身不屬于Cocoa平臺(tái)下的特有工具担孔,但一般來(lái)說(shuō)江锨,Cocoa工具鏈中包含的構(gòu)建、測(cè)試和代碼分析工具組合起來(lái)就是簡(jiǎn)單的代碼質(zhì)量管理糕篇,sonar是一個(gè)質(zhì)量管理平臺(tái)啄育,可以在服務(wù)器上搭建,可以利用這些工具在管理平臺(tái)上專門針對(duì)Cocoa項(xiàng)目的進(jìn)行代碼評(píng)估與質(zhì)量管理拌消,方便從質(zhì)量控制這一維度管理項(xiàng)目挑豌。
目標(biāo)
事實(shí)上,上述工具的介紹都隱隱約約指向一個(gè)目標(biāo)—持續(xù)交付墩崩,也許在項(xiàng)目復(fù)雜度還較低的情況下氓英,過早的引入軟件工程開發(fā)的方法論還為時(shí)尚早,但開發(fā)者應(yīng)該預(yù)見未來(lái)項(xiàng)目的規(guī)模增長(zhǎng)趨勢(shì)鹦筹,根據(jù)業(yè)務(wù)需求增長(zhǎng)水平铝阐,適時(shí)引入敏捷開發(fā)或者是Devops這樣的開發(fā)模式或者方法論,工具是開發(fā)流程實(shí)施的基礎(chǔ)設(shè)施铐拐,回答最初那幾個(gè)開發(fā)實(shí)際過程中出現(xiàn)的問題徘键,基礎(chǔ)的工具可以實(shí)現(xiàn)持續(xù)交付,提高開發(fā)遍蟋、測(cè)試啊鸭、運(yùn)維與QA等部門之間的合作效率,使得出現(xiàn)的諸如交付測(cè)試匿值、代碼質(zhì)量管理赠制、發(fā)布流程自動(dòng)化等等得以實(shí)現(xiàn),從而高效的完成工作
fastlane存在的問題
1.出現(xiàn)編碼不匹配的問題
[!] incompatible character encodings: US-ASCII and UTF-8 (Encoding::CompatibilityError)
解決方法:
首先在shell中查看環(huán)境變量
$ env | grep -e 'LANG'
查看是否有LANG環(huán)境變量值是否為utf8挟憔,如果沒有或者不是钟些,則在~/.bash_profile
中加入如下內(nèi)容:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
最后在$ source ~/.bash_profile
重新啟動(dòng)文件夾
2.使用CocoaPods管理第三方依賴以后,增加build configuration出現(xiàn)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
查看編譯出錯(cuò)的報(bào)告往往是找不到pod編譯后的庫(kù)绊谭,因?yàn)樾略黾恿艘粋€(gè)build configuration以后政恍,編譯后的路徑就發(fā)生改變,這時(shí)候达传,你可以把Podfile文件的所有第三方庫(kù)引用都注釋掉篙耗,執(zhí)行pod install
然后再把注釋取消迫筑,繼續(xù)pod install