本文转自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不可或缺的一部分,它只会愈来愈强大!