一、安装CocoaPods
第一步:升级ruby环境
更新Ruby环境
如果出现
更新ruby错误
然后就可以进行Cocoapods的安装了,
第二步:更换淘宝的RubyGems镜像代替官方版本,
移除官方的镜像
更换成淘宝镜像
验证是否更换成功
第三步:安装Cocoapods
如果你的是版本是10.11以下用这个命令
安装Cocoapods
如果你的是版本是10.11以上用这个命令
安装Cocoapods
然后执行
将Cocoapods Specs repository复制到你电脑的~/.cocoapods目录下
现在这个repo文件夹大概有750M,所以下载起来非常慢,如果你等的比较着急,想看一下当前下载的大小
首先
进入cocoa pods文件夹中
然后
用这个命令可以查看文件夹大小,我的已经下载完成了,一共是750M
至此我们的Cocoapods就安装完毕了。
二、如何使用我们的Cocoapods
第一步:创建一个Xcode工程并且进入你的Xcode工程的目录中
进入工程对应的文件夹
第二步:创建一个Podfile
执行pod init创建一个Podfile
或者
直接用vim Podfile创建一个Podfile
它们之间的区别就是pod init生成的Podfile会默认帮我们生成一些代码,而vim Podfile的Podfile是空的。
我是用pod init生成的Podfile文件
生成的默认代码
然后我们就要编写我们Podfile了,详见此文第四部分-我的Podfile
编辑好的Podfile文件
第三步:执行pod install.
初始化完成
然后打开MyApplication.xcworkspace就可以了。
三、pod update 和 pod install的区别
大部分人第一次初始化Podfile的时候会用pod install,之后就一直用pod update。
那么我们到底该怎么用他们呢,他们的之间的区别是什么呢?
pod install:每次如果下载新的pods的时候,都会把版本的信息写进podfile.lock中,podfile.lock会追踪这些版本,并且锁定这些版本。当你用这个命令的时候,他只会下载Podfile.lock中不存在的三方库。他也只会去下载Podfile.lock中记录的版本,而不会是检测一个更新的版本。如果没有Podfile.lock中没有指定版本,他会去搜索Podfile文件中对应的版本,如果不指定版本,默认为最新版本。
pod update [PODNAME]:会直接去找[PODNAME]最新的三方库,而不会去管Podfile.lock中的版本,他会一直下载最新版本,如果你指定了版本,他会下载你指定版本中最新的版本。如果使用 pod update,那么他会将你 Podfile中的所有三方库都更新成最新的版本。而且他会把Podfile.lock中的版本更改成对应的版本。
四、我的Podfile
第一行:你的平台+你支持的版本
(platform :ios, ‘8.0‘)
第二行:必须写上你所连接的Xcode target,这个一般就是你App的工程的名称
(target ‘MyApplication‘ do)
最后一行:end
(end)
第三到N行:在每一行添加一个你想要使用的三方库
(pod ‘$PODNAME‘)
我们有以下的几种方式添加三方库
一、添加开源的三方库
可以用pod search [PODNAME]命令搜索你想要的三方库
搜索到想要的三方库把对应的pod [PODNAME]添加到Podfile中即可,如果用pod [PODNAME]/[Subspecs]那么只使用对应的子三方库
关于版本的问题
‘> 0.1‘ :高于0.1的版本
‘>=0.1‘:0.1版本或者更高的版本
‘<0.1‘:小于0.1的版本
‘<=0.1‘:0.1版本或者更低的版本
‘~> 0.1.2‘:版本0.1.2~版本0.2,不包括0.2
‘~> 0.1‘:版本0.1~版本1.0,不包括版本1.0
二、从本地添加
1.从本地文件夹添加
pod ’Alamofire’, :path => ‘~/Documents/Alamofire‘
2.从主分支添加
pod ‘Alamofire’, :git => ’https://github.com/Alamofire/Alamofire.git‘
3.从次分支添加
pod‘Alamofire‘,:git=>‘https://github.com/Alamofire/Alamofire.git‘,:branch=>‘dev‘
4.用指定的tag
pod‘Alamofire‘,:git=>‘https://github.com/Alamofire/Alamofire.git‘,:tag=>‘3.1.1‘
5.用指定的commit
pod‘Alamofire‘,:git=>‘https://github.com/Alamofire/Alamofire.git‘,:commit=>‘0f506b1c45‘
五、创建私有podspec
这个和我们平常的项目最大的区别就是有必须.podspec和LICENSE这两个文件。
整体先说明一下创建一个私有的podspec包括如下那么几个步骤:
1.创建并设置一个私有的Spec Repo。
2.创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址。
3.创建Pod所对应的podspec文件。
4.本地测试配置好的podspec文件是否可用。
5.向私有的Spec Repo中提交podspec。
6.在个人项目中的Podfile中增加刚刚制作的好的Pod并使用。
7.更新维护pod spec。
在这一系列的步骤中需要创建两个Git仓库,分别是第一步和第二步(第二步不一定非要是Git仓库,只要是可以获取到相关代码文件就可以,也可以是SVN的,也可以说zip包,区别就是在podspec中的source项填写的内容不同),并且第一步只是在初次创建私有podspec时才需要,之后在创建其他的只需要从第二步开始就可以。本文只介绍在Git环境下的操作,其他环境其他方式暂不说明。
1.创建私有Spec Repo
先来说第一步,什么是Spec Repo?它是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,它实际是一个Git仓库remote端在GitHub上,但是当你使用了Cocoapods后它会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。
官方的Spec Repo目录
因此我们需要创建一个类似于master的私有Spec Repo,这里我们可以fork官方的Repo,也可以自己创建,个人建议不fork,因为你只是想添加自己的Pods,没有必要把现有的公开Pods都copy一份。所以创建一个 Git仓库,这个仓库你可以创建私有的也可以创建公开的,不过既然私有的Spec Repo,还是创建私有的仓库吧,需要注意的就是如果项目中有其他同事共同开发的话,你还要给他这个Git仓库的权限。因为GitHub的私有仓库是收费的,我还不是GitHub的付费用户,所以我使用了其他Git服务,我使用的是cocoachina,当然还有其他的可供选择开源中国、Bitbucket以及CSDN Code.
创建完成之后在Terminal中执行如下命令
MyLibrary是我们的私有库名字,后面是对应的git远程仓库的网址
此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到PrivateRepo这个目录了。至此第一步创建私有Spec Repo完成。
添加成功对应的文件夹
PS:如果有其他合作人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可。
2.创建Pod项目工程文件
这个第二步没有什么好介绍的,如果是有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。
如果你的组件还在你冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么我建议你使用Cocoapods提供的一个工具将第二步与第三步结合起来做。
现在来说一下这个工具,首先我们可以用pod lib create MyLibrary,可以带上--template-url=URL参数(URL表示git仓库的地址),就拿我创建的podTestLibrary为例子具体讲一下这里是如何操作的,先cd到要创建项目的目录然后执行
进入你想创建的指定的文件中
他会问我们五个问题:
第一个问题:Objective-C 或者 Swift
第二个问题:Making a Demo Application,如果选是就会在你的Xcode工程中新建一个工程。
如果你想要一个demo或者你需要一个测试单元在你的工程中,你应该选是
第三个问题:Choosing a Test Framework,你应该测试你的工程,确保别人可用
如何选择:如果你不能决定,就选Specta/Epecta
第四个问题:View-based Testing,会根据你选的测试自动生成一个
第五个问题: 你的前缀是什么。
这个里面要是不填的话默认就是横线的答案
当你填完这些他会默认调用pod install帮我们初始化好工程,并帮我们打开对应的工程
自动帮我们执行,不用我们进行配置
然后可以看到MyLibrary的目录如下(如果没有tree命令,可以用brew安装一个):
MyLibraray下面二层的目录结构
这时打开MyLibrary工程,会看到如下的文件目录:
MyLibrary对应的文件目录
1.Podspec metadata:可以让你改变你的README和MyLibrary.podspec
2.Example for MyLibrary:一个让你编写测试文件的文件夹,如果你没有选择测试文件夹,你就没有这个目录。
3.Tests:这里就是之前选择的测试模块
4.Development Pods:你实际写代码的地方,用你的代码代替ReplaceMe.m文件
5.Frameworks:
如果你写好了你的库,想写测试模块或者测试demo的时候,首先进入Example文件夹执行pod update命令,打开工程你应该包含 #import <MyLibrary/WaterFlowLayout.h>
Example文件夹对应的目录
特别注意:当你更改了了Pod/Classes或者Pod/Assets或者更新了你的pod spec,你应该执行pod install命令或者 pod update。
测试无误可以将项目添加并推送到远程仓库,配置你的podspec文件。
本地追踪并且快照
关联远程服务器
推送到远程master分支并打上tag
1、你应该保存你的.podspec文件格式是正确的
我的MyLibrary.podspec文件
用 pod lib lint 或者 pod spec lint可以检查.podspec有没有error或者warning,这两个都是不能出现的,两者的区别就是pod lib lint 不访问网络,pod spec lint 会检查仓库和对应的tag值。
2、如果你提交你的开源库到trunk,你不可以用任何的error 或者 warnings,不过你的xcode中是可以用警告,这里不做解释。
3、如果提交到你的私人的仓库中,如果你本地仓库已经有了对应的私有仓库,用
MyLibrary表示的是本地的私有库,MyLibrary表示对应的.podspec文件
否则你要先建立一个私有仓库.
3.创建podspec文件
如果已经有了现成的项目,么就需要给这个项目创建一个podspec文件,创建它需要执行Cocoapods的另外一个命令,官方文档在这里
PodTestLibrary为本地库名,后面为对应的git网址
执行完之后,就创建了一个podspec文件,他其中会包含很多内容,可以按照我之前介绍的进行编辑,没用的删掉。编辑完成之后使用验证命令验证一下,验证无误就可以进入下一步了。
本地测试podspec文件
我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式
可以用指定:path或者用指定:podspec路径这两种方法
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodTestLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
用.xcworkspace打开的文件目录如下
在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。
向Spec Repo提交podspec
向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令
完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/WTSpecs目录下查看
再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。
至此,我们的这个组件库就已经制作添加完成了,使用pod search命令就可以查到我们自己的库了
这里说的是添加到私有的Repo,如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档。
使用制作好的Pod
在完成这一系列步骤之后,我们就可以在正式项目中使用这个私有的Pod了只需要在项目的Podfile里增加以下一行代码即可
$ pod ‘PrivateRepo‘,‘~> 0.1.0‘
然后执行pod update,更新库依赖,然后打开项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了,而不再是Development Pods。
更新维护podspec
最后再来说一下制作好的podspec文件后续的更新维护工作,比如如何添加新的版本,如何删除Pod。
我已经制作好了PodTestLibrary的0.0.1版本,现在我对他进行升级工作,这次我添加了更多的模块到PodTestLibrary之中,包括工具类,底层Model及UIKit扩展等,这里又尝试了一下subspec功能,给PodTestLibrary创建了多个子分支。
具体做法是先将源文件添加到Pod/Classes中,然后按照不同的模块对文件目录进行整理,因为我有四个模块,所以在Pod/Classes下有创建了四个子目录,完成之后继续编辑之前的PodTestLibrary.podspec,这次增加了subspec特性
因为我们创建了subspec所以项目整体的依赖dependency,源文件source_files,头文件public_header_files,资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如UIKitAddition就依赖于CommonTools。
编辑完成之后,在测试项目里pod update一下,几个子项目都被加进项目工程了,写代码验证无误之后,就可以将这个工程push到远端仓库,并打上新的tag->1.0.0。
最后再次使用pod lib lint验证编辑好的podsepc文件,没有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一样的
最后介绍一下如何删除一个私有Spec Repo
PrivateRepo用你的私有库代替
这样这个Spec Repo就在本地删除了,我们还可以通过
前面表示你私有库的名字,后面表示 git对应的远程仓库的地址
再把它给加回来。
如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods
cd到对应的文件夹,删掉对应的库就好了
参考文章:https://guides.cocoapods.org/
http://www.cocoachina.com/ios/20150228/11206.html