iOS 开发之Cocoapods的使用及制作私有pods

一、安装CocoaPods

第一步:升级ruby环境

```

sudo gem updte --system

```

更新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中执行如下命令

PrivateRepo是我们的私有库名字,后面是对应的git远程仓库的网址

此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到PrivateRepo这个目录了。至此第一步创建私有Spec Repo完成。

添加成功对应的文件夹

PS:如果有其他合作人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可。

2.创建Pod项目工程文件

这个第二步没有什么好介绍的,如果是有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。

如果你的组件还在你冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么我建议你使用Cocoapods提供的一个工具将第二步与第三步结合起来做。

现在来说一下这个工具,首先我们可以用pod lib create PrivateRepo,可以带上--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帮我们初始化好工程,并帮我们打开对应的工程

自动帮我们执行,不用我们进行配置

然后可以看到PrivateRepo的目录如下(如果没有tree命令,可以用brew安装一个):

PrivateRepo下面二层的目录结构

PrivateRepo下面二层的目录结构

这时打开PrivateRepo工程,会看到如下的文件目录:

PrivateRepo对应的文件目录

1.Podspec metadata:可以让你改变你的README和MyLibrary.podspec

2.Example for PrivateRepo:一个让你编写测试文件的文件夹,如果你没有选择测试文件夹,你就没有这个目录。

3.Tests:这里就是之前选择的测试模块

4.Development Pods:你实际写代码的地方,用你的代码代替ReplaceMe.m文件

将文件或者代码写进来

5.Frameworks:

如果你写好了你的库,想写测试模块或者测试demo的时候,首先进入Example文件夹执行pod update命令,打开工程你应该包含 #import <PrivateRepo/XYZ.h>

然后包含对应的头文件就可以了

特别注意:当你更改了了Pod/Classes或者Pod/Assets或者更新了你的pod spec,你应该执行pod install命令或者 pod update。

测试无误可以将项目添加并推送到远程仓库,配置你的podspec文件。

本地追踪并且快照
关联远程服务器
推送到远程master分支并打上tag

1、你应该保存你的.podspec文件格式是正确的

我的PrivateRepo.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中的缘故。

在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。

4.向Spec Repo提交podspec

向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令

完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/PrivateRepo目录下查看

再去看我们的PrivateRepo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。

至此,我们的这个组件库就已经制作添加完成了,使用pod search命令就可以查到我们自己的库了。

搜索之后的结果

这里说的是添加到私有的Repo,如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档

使用制作好的Pod

在完成这一系列步骤之后,我们就可以在正式项目中使用这个私有的Pod了,然后要指定我们的source,并且将我们私有的库添加进去即可:

指定source并且添加即可测试

然后执行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

推荐阅读更多精彩内容