创建一个私有的podspec包括如下那么几个步骤:
- 创建并设置一个私有的Spec Repo。
- 创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址。
- 创建Pod所对应的podspec文件。
- 本地测试配置好的podspec文件是否可用。
- 向私有的Spec Repo中提交podspec。
- 在个人项目中的Podfile中增加刚刚制作的好的Pod并使用。
- 更新维护podspec。
- 创建私有Spec Repo
先来说第一步,什么是Spec Repo?它是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,它实际是一个Git仓库remote端在GitHub上,但是当你使用了Cocoapods后它会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。这个master目录的结构是这个样子的
- ├── Specs
- └── [SPEC_NAME]
- └── [VERSION]
- └── [SPEC_NAME].podspec
因此我们需要创建一个类似于master的私有Spec Repo,可以fork官方的Repo
创建完成之后在Terminal中执行如下命令
- pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
- pod repo add NewRepo http://github.com/newrepo/NewRepo.git
此时如果成功的话进入到 ~/.cocoapods/repos
目录下就可以看到 NewRepo
这个目录了。至此第一步创建私有 Spec Repo
完成。
PS:如果有其他合作人员共同使用这个私有 Spec Repo
的话在他有对应 Git
仓库的权限的前提下执行相同的命令添加这个 Spec Repo
即可。
创建 Pod
项目工程文件
创建新的组件项目,可以使用Using Pod Lib Create来创建项目
- $ pod lib create PodDemoLibrary
之后四个问题,
- 是否需要一个例子工程;
- 选择一个测试框架;
- 是否基于View测试;
- 类的前缀;
具体介绍可以去看官方文档,我这里选择的是 1.yes;2.Specta/Expecta;3.yes;4.JD。
问完这4个问题他会自动执行pod install命令创建项目并生成依赖。
1 | $ tree PodDemoLibrary -L 2 |
以上是项目生成的目录结构及相关介绍。
接下来就是向Pod文件夹中添加库文件和资源,并配置podspec文件,我把一个网络模块的组件放入Pod/Classes中,然后进入Example文件夹执行pod update命令,再打开项目工程可以看到,刚刚添加的组件已经在Pods子工程下Development Pods/PodDemoLibrary中了,然后编辑demo工程,测试组件。
注:这里需要注意的是每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。
测试无误后需要将该项目添加并推送到远端仓库,并编辑podspec文件。
通过Cocoapods创建出来的目录本身就在本地的Git管理下,我们需要做的就是给它添加远端仓库,同样去GitHub或其他的Git服务提供商那里创建一个私有的仓库,拿到SSH地址,然后cd到PodDemoLibrary目录
1 | $ git add . |
因为 podspec
文件中获取 Git
版本控制的项目还需要 tag
号,所以我们要打上一个 tag
,
1 | $ git tag '0.1.0' |
做完这些就可以开始编辑podspec文件了,它是一个Ruby的文件,把编辑器的格式改成Ruby就能看到语法高亮,下面我贴上我的podspec文件,并在后面以注释的形式说明每个字段的含义,没有涉及到的字段可以去官方文档查阅
1 | Pod::Spec.new do |s| |
编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不过xcode的WARNING是可以存在的,验证需要执行一下命令
1 | $ pod lib lint |
当你看到
1 | -> PodDemoLibrary (0.1.0) |
时,说明验证通过了,不过这只是这个podspec文件是合格的,不一定说明这个Pod是可以用的,我们需要在本地做一下验证,这就是第四步的内容了,第四步在具体说明。
创建podspec文件
如果从第二步过来,已经有了现成的项目,那么就需要给这个项目创建一个podspec文件,创建它需要执行Cocoapods的另外一个命令,官方文档在这里
1 | $ pod spec create PodDemoLibrary [email protected]:abc/PodDemoLibrary.git |
执行完之后,就创建了一个podspec文件,他其中会包含很多内容,可以按照我之前介绍的进行编辑,没用的删掉。编辑完成之后使用验证命令验证一下
1 | $ pod lib lint |
验证无误就可以进入下一步了。
本地测试podspec文件
我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式
1 | platform :ios, '7.0' |
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodDemoLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。
向Spec Repo提交podspec
向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。
向我们的私有Spec Repo提交podspec只需要一个命令
1 | $ pod repo push NewRepo PodDemoLibrary.podspec #前面是本地Repo名字 后面是podspec名字 |
完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/NewRepo目录下查看
1 | ├── LICENSE |
再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。
至此,我们的这个组件库就已经制作添加完成了,使用pod search命令就可以查到我们自己的库了
1 | $ pod search PodDemoLibrary |
这里说的是添加到私有的Repo,如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档。
使用制作好的Pod
在完成这一系列步骤之后,我们就可以在正式项目中使用这个私有的Pod了只需要在项目的Podfile里增加以下代码即可
1 | #指出Pod源地址,否则只会在官方地址中寻找 |
1 | $ pod 'PodDemoLibrary', '~> 0.1.0' |
然后执行pod update,更新库依赖,然后打开项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了,而不再是Development Pods。
更新维护podspec
最后再来说一下制作好的podspec文件后续的更新维护工作,比如如何添加新的版本,如何删除Pod。
我已经制作好了PodDemoLibrary的0.1.0版本,现在我对他进行升级工作,这次我添加了更多的模块到PodDemoLibrary之中,包括工具类,底层Model及UIKit扩展等,这里又尝试了一下subspec功能,给PodDemoLibrary创建了多个子分支。
具体做法是先将源文件添加到Pod/Classes中,然后按照不同的模块对文件目录进行整理,因为我有四个模块,所以在Pod/Classes下有创建了四个子目录,完成之后继续编辑之前的PodDemoLibrary.podspec,这次增加了subspec特性
1 | Pod::Spec.new do |s| |
因为我们创建了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中
1 | $ pod repo push NewRepo PodDemoLibrary.podspec |
之后再次到~/.cocoapods/repos/NewRepo目录下查看
1 | . |
已经有两个版本了,使用pod search可以看到记录
完成这些之后,在实际项目中我们就可以选择使用整个组件库或者是组件库的某一个部分了,对应的Podfile中添加的内容为
1 | platform :ios, '8.0' |
最后介绍一下如何删除一个私有Spec Repo,只需要执行一条命令即可
1 | $ pod repo remove NewRepo |
这样这个Spec Repo就在本地删除了,我们还可以通过
1 | $ pod repo add NewRepo [email protected]:abc/NewRepo.git |
再把它给加回来。
如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods,只需要cd到~/.cocoapods/repos/NewRepo目录下,删掉库目录
1 | $ rm -Rf PodDemoLibrary |
然后在将Git的变动push到远端仓库即可
1 | $ git add --all . |