文明是建立在道路,橋梁,運河,下水道,管線,電線和光纖這些基礎設施之上的。隻要設計和施工得當,它們可以幫助社會成倍的發展。
唯一的問題就是可擴充性。 不管是在一個新的區域容納上百萬家庭還是整合大量的開發者到新的語言環境中去,挑戰都是相同的。 在Objective-C的情況下, CocoaPods提供了一個絕佳的整合合作開發的工具,并且在快速發展的開發社群中起到了一個集結點的作用。 本周的NSHipster,我們将通過讨論CocoaPods的過去,現在以及将來,一起慶祝0.33版本( 具有裡程碑意義)的釋出。 接下來的對CocoaPods起源的曆史回顧比較冗長,如果你隻在乎技術細節,點此直接跳過。 回望 在Objective-C在它存在的前20年左右幾乎鮮為人知。NeXT和後來的OS X作為一個邊緣平台,隻擁有一個相對較小的使用者和開發者社群。像所有的社群一樣,本地使用者小組,郵件清單和網站該有的都有,但是開源合作開發缺很少見。誠然,開源在那時也隻處于起步階段,但是Objective-C卻從未有過類似于CPAN (the Comprehensive Perl Archive Network)的組織。所有人除了能從Redwood和Cupertino拿到SDK(或者在論壇搜尋一下可用的代碼)以外,剩下的問題隻能靠自己解決。 Objective-C和iPhone 這種情況一直持續到了2008年的夏天,當iPhone OS開始對第三方開發者開放的時候。幾乎一夜之間,Objective-C從無人問津變的炙手可熱。上百萬開發者的湧入,給這門語言注入了新鮮的血液。 就在此時,GitHub 也剛剛釋出,并且開始通過新的分布式合作開發方式改變我們對開源的認知。 一大批開源項目開始湧現,例如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時代 CocoaPods是由 Eloy Durán于2011年8月12日建立。 在Bundler和RubyGems的啟發下,CocoaPods被設計成即能處理庫之間的依賴關系,又能自動下載下傳并且配置好所需要的庫。試想一下 開發隻有松散文檔編制的Xcode項目的難度,CocoaPods的存在簡直就是奇迹。 另一個早先的決定就是利用 central Git repository作為所有庫的總資料庫。雖然這帶來了一些運籌上的顧慮,好在GitHub能夠提供一個穩健的平台,幫助團隊在後續的疊代中,開發出更好的工具鍊。 時至今日,CocoaPods已經壯大擁有14個核心開發人員和多達 5000個開源項目。絕大部分項目都是來自于Objective-C開源社群,我們應該感謝每一個參與其中的開發者。 使用CocoaPods 制作和使用CocoaPods庫都十分簡單,往往幾分鐘就能配置完畢。 想擷取最新的官方教程,請 前往此處。 安裝CocoaPods CocoaPods可以友善地通過RubyGems安裝,打開Terminal,然後鍵入以下指令:
- $ sudo gem install cocoapods
就這麼簡單,現在你應該可以開始使用pod指令了。 如果你使用Ruby版本管理器,如 rbenv,你可能需要運作以下指令來重新連結shim的二進制檔案(例如:$ rbenv rehash)。 管理相關性 一個相關性管理器可以将一系列的軟體需求轉化為具體的标簽,然後下載下傳并且整合進入相關的項目。 申明需求可以自動化整個項目配置,這也是軟體開發的 最佳實踐之一,無論是在任何語言中。**甚至你不使用第三方庫,CocoaPods仍然是一個管理代碼相關性的絕佳工具。** Podfile Podfile這個檔案是用來用來申明項目代碼相關性的,正如 Bundler的Gemfile,或者 npm的package.json cd進入.xcodeproj檔案所在的目錄,通過以下指令來建立一個Podfile
- $ pod init
Podfile
- 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
試着使用CocoaPod try是一個及其實用但又鮮為人知的CocoaPods指令,通過它你能夠在安裝一個庫之前,先試用一下。 你隻需要在try後面加上任意一個CocoaPods公共庫的名稱,就能試用它了!
- $ pod try Ono
建立自己的CocoaPod 作為Objective-C軟體分發實際上的标準,CocoaPods幾乎是所有開源項目的标配,如果你想讓你的項目被大家很友善地使用。 誠然,這會提高一點點你分享項目的門檻,但是,好處是顯然易見的。你花幾分鐘建立一個.podspec檔案可以節省下其他開發者無數的時間。 規範 .podspec檔案作為CocoaPods的一個獨立單元,包含了名稱,版本,許可證,和源碼檔案等所有資訊。 官方指南中有許多資訊和範例 以下是NSHipsterKit.podspec
- 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' =>
- '[email protected]' }
- 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中加入如下聲明即可: Podfile
- pod 'NSHipsterKit', '~> 1.0'
.podspec檔案也可以作為管理内部代碼的利器:
- pod 'Z', :path => 'path/to/directory/with/podspec'
釋出CocoaPod 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 [email protected] "Mattt Thompson"
至此,你就可以通過以下指令來友善地釋出和更新你的Pod!
- $ pod trunk push NAME.podspec
已經釋出Pod的作者可以通過 幾個簡單的步驟來聲明所有權。 展望 CocoaPods例證了一個社群的凝聚力。在短短的幾年内,Objective-C社群讓我們所有人都引以為傲。 CocoaPods僅僅是衆多Objective-C基礎設施的一部分,還有諸如 Travis CI, CocoaDocs和 Nomad這些非常好的生産力工具。 雖然整個社群的未來不會一帆風順,不管怎樣,讓我們懷着信念,盡可能的提供建設性的意見。我們更應該互相幫助,樂于分享,共同努力推動整個社群的進步! CocoaPods已經是Objective-C不可或缺的一部分,它隻會越來越強大! 來源: nshipster中文站