本文轉自http://nshipster.cn/cocoapods/ios
文明是創建在道路,橋樑,運河,下水道,管線,電線和光纖這些基礎設施之上的。只要設計和施工得當,它們能夠幫助社會成倍的發展。git
惟一的問題就是可擴展性。github
不論是在一個新的區域容納上百萬家庭仍是整合大量的開發者到新的語言環境中去,挑戰都是相同的。objective-c
在Objective-C的狀況下,CocoaPods提供了一個絕佳的整合合做開發的工具,而且在快速發展的開發社區中起到了一個集結點的做用。數據庫
本週的NSHipster,咱們將經過討論CocoaPods的過去,如今以及未來,一塊兒慶祝0.33版本(具備里程碑意義)的發佈。npm
接下來的對CocoaPods起源的歷史回顧比較冗長,若是你只在意技術細節,點此直接跳過。json
在Objective-C在它存在的前20年左右幾乎不爲人知。NeXT和後來的OS X做爲一個邊緣平臺,只擁有一個相對較小的用戶和開發者社區。像全部的社區同樣,本地用戶小組,郵件列表和網站該有的都有,可是開源合做開發缺不多見。誠然,開源在那時也只處於起步階段,可是Objective-C卻從未有過相似於CPAN (the Comprehensive Perl Archive Network)的組織。全部人除了能從Redwood和Cupertino拿到SDK(或者在論壇搜尋一下可用的代碼)之外,剩下的問題只能靠本身解決。xcode
這種狀況一直持續到了2008年的夏天,當iPhone OS開始對第三方開發者開放的時候。幾乎一晚上之間,Objective-C從無人問津變的煊赫一時。上百萬開發者的涌入,給這門語言注入了新鮮的血液。ruby
就在此時,GitHub 也剛剛發佈,而且開始經過新的分佈式合做開發方式改變咱們對開源的認知。bash
一大批開源項目開始涌現,例如ASIHTTPRequest和Facebook的Three20。這些早期的庫和框架主要是用來填補iPhone OS 2.0和3.0開發中遇到空白,而且在後續的OS迭代中慢慢被遺棄或取代,可是它們突破了每一個開發者「單打獨鬥」的局面。
在這波新的開發者中,那些來自Ruby背景的對 Objective-C 起來了很大的影響。Ruby做爲Perl的精神繼承者,有一個相似於CPAN的包管理器:RubyGems
爲何受Ruby的影響這麼大?個人理論是:Ruby是在Rails 2005年發佈1.0版本的時候開始流行起來。假設創業公司的平均壽命在1.5到2.5年之間,那麼此時第一批厭倦Rails的開發者正好能夠跳上移動開發的大船上。
就在Objective-C開源開發漸入佳境之時,代碼分發的痛點開始顯現:
缺少框架,iOS的代碼雖然能夠被打包成靜態庫,可是配置和同步分發卻成了一個艱鉅的任務。
另一個思路是用Git Submodules把源碼直接放入項目。可是連接框架和配置生成環境的繁瑣也使得這種方法也沒有好到哪裏去,尤爲是當ARC和 non-ARC的代碼須要分開的時候。
CocoaPods是由Eloy Durán於2011年8月12日建立。
在Bundler和RubyGems的啓發下,CocoaPods被設計成即能處理庫之間的依賴關係,又能自動下載而且配置好所須要的庫。試想一下開發只有鬆散文檔編制的Xcode項目的難度,CocoaPods的存在簡直就是奇蹟。
另外一個早先的決定就是利用central Git repository做爲全部庫的總數據庫。雖然這帶來了一些運籌上的顧慮,好在GitHub可以提供一個穩健的平臺,幫助團隊在後續的迭代中,開發出更好的工具鏈。
時至今日,CocoaPods已經壯大擁有14個核心開發人員和多達5000個開源項目。絕大部分項目都是來自於Objective-C開源社區,咱們應該感謝每個參與其中的開發者。
製做和使用CocoaPods庫都十分簡單,每每幾分鐘就能配置完畢。
想獲取最新的官方教程,請前往此處。
CocoaPods能夠方便地經過RubyGems安裝,打開Terminal,而後鍵入如下命令:
$ sudo gem install cocoapods
就這麼簡單,如今你應該能夠開始使用pod命令了。
若是你使用Ruby版本管理器,如rbenv,你可能須要運行如下指令來從新連接shim的二進制文件(例如:$ rbenv rehash)。
一個相關性管理器能夠將一系列的軟件需求轉化爲具體的標籤,而後下載而且整合進入相關的項目。
申明需求能夠自動化整個項目配置,這也是軟件開發的最佳實踐之一,不管是在任何語言中。甚至你不使用第三方庫,CocoaPods仍然是一個管理代碼相關性的絕佳工具。
Podfile
這個文件是用來用來申明項目代碼相關性的,正如Bundler的Gemfile
,或者npm的package.json
cd
進入.xcodeproj
文件所在的目錄,經過如下命令來建立一個Podfile
$ pod init
platform :ios, '7.0' target "AppName" do end
你能夠申明須要不一樣版本的庫,大部分狀況下,申明到minor或者patch版本就足夠了
pod 'X', '~> 1.1'
CocoaPods遵循語意化版本規範。
對於那些不在CocoaPods公共Git倉庫中的庫,你能夠用任何一個Git, Mercurial或者SVN倉庫取代,而且還能夠指定具體的commit, branch或者tag。
pod 'Y', :git => 'https://github.com/NSHipster/Y.git', :commit => 'b4dc0ffee'
一旦全部的相關性都申明完畢,你可使用如下指令來安裝所須要的庫:
$ pod install
安裝過程當中,CocoPods會使用遞歸來分析全部的需求,而且創建一個代碼相關性的圖,最後將Podfile序列化爲Podfile.lock
好比,若是兩個庫都須要使用AFNetworking,CocoaPods會肯定一個同時能被這兩庫使用的版本,而後將同一個安裝版本連接到兩個不一樣的庫中。
CocoaPods會建立一個新的包含以前安裝好的靜態庫Xcode項目,而後將它們連接成一個新的libPods.a target。你原有的項目將會依賴這個新的靜態庫。一個xcworkspace文件會被建立,今後以後,你應該只打開這個xcworkspace文件來進行開發。
反覆使用pod install命令,只會讓CocoaPods重複以上步驟,從新安裝這些庫。因此,當你須要升級它們時,請使用如下命令:
$ pod update
try
是一個及其實用但又不爲人知的CocoaPods命令,經過它你可以在安裝一個庫以前,先試用一下。
你只須要在try
後面加上任意一個CocoaPods公共庫的名稱,就能試用它了!
$ pod try Ono
做爲Objective-C軟件分發實際上的標準,CocoaPods幾乎是全部開源項目的標配,若是你想讓你的項目被你們很方便地使用。
誠然,這會提升一點點你分享項目的門檻,可是,好處是顯然易見的。你花幾分鐘建立一個.podspec
文件能夠節省下其餘開發者無數的時間。
.podspec
文件做爲CocoaPods的一個獨立單元,包含了名稱,版本,許可證,和源碼文件等全部信息。
官方指南中有許多信息和範例
Pod::Spec.new do |s| s.name = 'NSHipsterKit' s.version = '1.0.0' s.license = 'MIT' s.summary = "A pretty obscure library. You've probably never heard of it." s.homepage = 'http://nshipster.com' s.authors = { 'Mattt Thompson' => 'mattt@nshipster.com' } s.social_media_url = "https://twitter.com/mattt" s.source = { :git => 'https://github.com/nshipster/NSHipsterKit.git', :tag => '1.0.0' } s.source_files = 'NSHipsterKit' end
一旦把這個.podspec
發佈到公共數據庫中,任何想使用它的開發者,只須要在Podfile中加入以下聲明便可:
pod 'NSHipsterKit', '~> 1.0'
.podspec
文件也能夠做爲管理內部代碼的利器:
pod 'Z', :path => 'path/to/directory/with/podspec'
CocoaPods 0.33中加入了Trunk服務。
雖然一開始使用GitHub Pull Requests來整理全部公共pods效果很好。可是,隨着Pod數量的增長,這個工做對於spec維護人員Keith Smiley來講變得十分繁雜。甚至一些沒有經過$ pod lint
的spec也被提交上來,形成repo沒法build。
CocoaPods Trunk服務的引入,解決了不少相似的問題。CocoaPods做爲一個集中式的服務,使得分析和統計平臺數據變得十分方便。
要想使用Trunk服務,首先你須要註冊本身的電腦。這很簡單,只要你指明你的郵箱地址(spec文件中的)和名稱便可。
$ pod trunk register mattt@nshipster.com "Mattt Thompson"
至此,你就能夠經過如下命令來方便地發佈和升級你的Pod!
$ pod trunk push NAME.podspec
已經發布Pod的做者能夠經過幾個簡單的步驟來聲明全部權。
CocoaPods例證了一個社區的凝聚力。在短短的幾年內,Objective-C社區讓咱們全部人都引覺得傲。
CocoaPods僅僅是衆多Objective-C基礎設施的一部分,還有諸如Travis CI, CocoaDocs和Nomad這些很是好的生產力工具。
雖然整個社區的將來不會一路順風,無論怎樣,讓咱們懷着信念,儘量的提供建設性的意見。咱們更應該互相幫助,樂於分享,共同努力推進整個社區的進步!
CocoaPods已是Objective-C不可或缺的一部分,它只會愈來愈強大!