想了想, 发现自己好久都没有写新的文章了, 还有一些朋友跑过来说我的掘金好久没更新了, 其实不是的, 我一直在维护并更新玩转iOS开发:自己造的轮子《CLUIKit》和玩转iOS开发:自己造的轮子《CLFoundation》, 只是没有文章的更新日期, 这个没法看到我更新文章而已, 希望掘金考虑考虑加上个更新时间~~
请他喝杯星爸爸
如果您觉得挺赞的话, 可以我喝杯星爸爸, 谢谢啦~

这段时间除了忙着做项目之外, 还有一件事就是制作CocoaPods库, 这个东西虽然好用, 不研究还好, 一研究就会发现, 真的是.....

搞了一两天, 搜了N多个百度和谷歌, 也咨询了很多大佬, 终于捣鼓出来了, 下面就直接上文章, 不那么多废话了.
创建podspec文件
使用终端找到需要创建CocoaPods开发库的文件夹
cd Project文件夹

找到对应的路径后, 再输入创建podspec文件的命令
pod spec create 库名

编辑podspec文件
打开库名.podspec文件之后, 我们会看到很多对应的注释, 按照个人喜欢, 选择删掉或者不删掉, 这里为了演示选择删掉全部注释.

这里解释一下各个参数:
- name: 库名, 必选
- version: 版本号, 必选
- summary: 库的概要
- description: 库的描述, 可选
- homepage: 库的首页, 可选
- license: 开源协议, 如有开源协议必选
- author: 作者, 必选, 详情看文章后面的介绍
- platform: 设置最低支持的系统版本号, 可选
- source: 资源地址, 必选
- source_files: 资源文件, 必选
- exclude_files: 排除文件, 可选
- requires_arc: 是否是ARC, 可选
- frameworks: 需要关联的系统Frameworks
- dependency: 需要关联的第三方库
更详细的可以到CocoaPods网站去查询
这里我们举个例子, CLUIKit.podspec的写法, 这里只依赖了三个库, MJRefresh, CLFoundation和Masonry.

上面这种写法比较适合单一的库, 比如MJRefresh, CLFoundation和Masonry这类型的, 但如果我们需要拆分出几个子模块让开发者去选择, 这里有两种方案:
- 开启多一个
Git仓库, 分开来存储 - 通过编写
podspec文件的技巧拆分.
这里我们推荐第二种方案.
编写podspec文件进阶
这里我们可以找到最经典的案例就是AFNetworking.podspec, 如果这个库全都是我们自己写的, 那么可以参照着来写:


但如果我们是要依赖于第三方的库或者是Framework, 那这里可能就不适合了, 比如CLMapKit.podspec, 这里依赖了GoogleMaps, 并且未来可能还会兼容其他的地图库, 那么我们就必须拆分成N个子模块, 并且要针对来编写:

- **subspec: **子模块的标签, 名字可自定义
- static_framework: 静态库标签, 表示我们依赖的
Framework是静态的.
这里需要注意一点的就是source_files这个标签, 在GoogleMap这个子模块里, 我们的写法要根据我们的文件层级来编写, 比如CLMapKit这个库的GoogleMap模块, 它的层级就是CLMapKit/GoogleMap/CLGoogleMapViewController, 最后才到要共享的文件, 所以我们在这里要写成图上锁显示的那样.
并且针对GoogleMap这个subspec写上所依赖的库:
- dependency: GoogleMaps
如果我们这个库里面需要.Bundle文件, 那我们就需要加一个Resource标签:
- resource: Classese/BundleName.bundle
验证podspec文件
当我们写好了podspec文件之后, 我们就需要在本地验证一下:
pod spec lint

这个时候我们没有看到有任何的error信息, 就已经ok了, 如果我们不想要警告的话, 可以带上--allow-warnings这个关键词.
发布第三方库
经过上面我们的编写, 以及验证podspec文件之后, 我们就可以准备发布我们的库了, 这里我们只讲解如何发布开源的库, 私有的暂时不去研究先.
创建公共的Git仓库
首先我们需要去创建一个Git仓库, 大多数老铁选择的是GitHub, 怎么创建, 怎么clone, 这里就不解释了, 我们把代码上传上GitHub之后会有一个酱紫的界面:

所有代码文件及podspec文件上传了之后, 我们就继续下一步.
创建Git Tag
之前我们解释过在podspec有一个标签叫做version, 这个标签是用来标注pod库的版本号, 这个版本号是不能重叠的, 这里建议大家这个version版本号和Git Tag保持一致就好了.
在创建Git Tag之前, 我们首先要去到我们Clone下来的文件夹内, 然后利用命令创建, 创建Git Tag的命令:
git tag 版本号
创建完成后, 我们需要把这个Git Tag推到GitHub上, 这个时候我们需要用到Push命令:
git push origin --tags
切记, 在创建
Git Tag之前一定要把所有操作都完成后再进行, 否则会造成Git Tag于内容不同步 .
删除Git Tag
如果我们需要删掉本地的Git Tag的话, 我们可以使用删除命令:
git tag -d 版本号
如果我们是需要删除远程仓库里的Git Tag的话, 我们可以使用远程删除命令:
git push origin --delete 版本号
这样子我们就可以删除掉远程仓库的Git Tag了.
查询Git Tag
如果我们需要查询已有的本地Git Tag, 那么我们可以使用查询命令:
git tag

如果我们是需要查询远程仓库的话, 我们可以使用查询指定的分支去查看:
git show origin

暂时没找到如何查看远程仓库
Tag的命令, 只能用上面的方式了.
注册CocoaPods
发布前的最后一个操作就是注册CocoaPods, 我们可以使用下面的命令去注册:
pod trunk register 邮箱 '昵称'

做完这个操作只有, 你的邮箱会收到一封邮件, 我们打开了那个链接之后, 如果网站显示了一张图, 上面写着You can go back to your terminal new., 那我们就可以继续下一步操作, 发布我们的CocoaPods库了.

发布CocoaPods
回到我们的库首目录(就是有.podspec文件的那个目录), 然后使用Trunk命令:
pod trunk push
如果我们在验证的时候发现了有几个Warnings的话, 那我们就需要加上一个关键词:
pod trunk push --allow-warnings
如果我们还想看到详细信息的话, 我们还可以加上另一个关键词:
pod trunk push --allow-warnings --verbose
如果我们在检测时发现了图中的错误:

那我们就需要加上另一个关键词:
pod trunk push --allow-warnings --use-libraries
最后我们输入完所有命令, 看到了图中所示, 那就说明了我们的库发推送成功了:

查找已发送的库
当我们推送完库之后直接去pod search ProjectName, CocoaPods会提示找不到, 原因是因为本地的CocoaPods search_index.json文件没有更新到, 这个时候我们可以手动删除该文件, 再重新去搜索, 就可以搜索到了.

文件路径一般是在:/Users/您的用户名/Library/Caches/CocoaPods/
PS: 删掉再次搜索, 需要一段时间, 请耐心等待.
补充
关于更多的CocoaPods的标签可以到CocoaPods Guides里查询到, 如果是遇到一些bug可以到GitHub CocoPods留下你的Issues.
疑问
在研究CocoaPods的时候, 我有一个疑问, 怎么创建一个podspec文件, 去关联不同的第三方库, 并且不会引起他们之间的冲突, 比如高德2D地图和高德3D地图就会引起Framework的冲突.
并且可以在这个大的podspec里可以自由的选择高德2D地图和高德3D地图导入到工程里, 不知道是CocoaPods不支持, 还是我还没研究透, 如果可以的话, 希望老铁们给我解惑解惑.