CocoaPod 发布记录
第一次使用 pod 发布自己的工具,使用 pods 创建到发布踩了不少坑,用了一天多的时间,终于发布了自己的第一个小工具。记录一下整体流程和所踩的坑。
参考
查阅参考资料的正确姿势:
- 先从官网上看整个东西是什么,有个整体认识,逻辑层面的,可以不求甚解,能直接在官网一步到位最好(直接使用官方最新版本)
- 官网毕竟内容偏全,有时候英语不好,阅读困难,再去网络上找网友相关资料(这个质量和时效性就不能保证了,这点在我这次采坑中体现的很是明显,官方新版的默认源已经不是我之前版本的了,导致基本的search功能都找不到)
本次我查阅的参考资料如下:
最直接的文档为官方文档,跟着做就行,但是有些内容例子过于简单,一些地方可能无法理解具体意思。
网络上比较好的一篇文章也可以看,我看过受益很多,结合一天的采坑也更加清晰了整个思路和流程。做个记录,证明我来过。
创建并发布 CocoaPod 流程
无论是创建公有库还是私有库,其思路是一样的。主要区别是私有库的 Spec Repo
源地址在私人的git仓库下。公有库的 Spec Repo
源 master
是官方统一维护存放到 GitHub
上的源。可以使用 pod repo
查看当前 pod 源仓库列表
值得注意的是 pod 在 1.8 之后开始将 GitHub 托管的源默认使用CDN加速,使用者无需再将该 GitHub 上那个已经十分臃肿 (公开库已经超过 6w+ ) 的 master
源到自己 ~/.cocoapods/repo
下,取而代之的是 CDN 加速的 trunk
源
现在我以我自己做的发布到公有库为例,说一下流程(官方流程)。
- 创建一个
Pod
工程文件,并设置可访问的项目版本控制地址 - 创建
Pod
对应的podspec
文件 - 本地测试配置好的
podspec
文件是否可用 - 提交
podspec
到公有Spec Repo
- 在个人项目的
Podfile
中添加制作好的Pod
并使用 - 更新维护
podspec
下面逐步说一下
创建Pod工程文件
我已经写好完整的 Demo 工程并放到了 SectionDemo 所以可以直接开始创建 podspec 文件了。
如果是项目需要从零开始搭建,那么可以使用 Using Pod Lib Create 创建一个模板。这个模板内部会自动创建好 podspec
文件
pod lib create MyLibrary
创建模板过程中会询问使用OC/Swift,是否设置Demo程序,是否选择测试框架,OC类前缀等问题。这个按自己情况选择就行。选完之后会自动调用 pod install
,安装完之后项目模板的结构如下,
MyLib
├── .travis.yml
├── _Pods.xcproject
├── Example ---> 这个你Demo工程,可以自己完善
│ ├── MyLib
│ ├── MyLib.xcodeproj
│ ├── MyLib.xcworkspace
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ └── Tests
├── LICENSE ---> 开源协议文件,默认 MIT
├── MyLib.podspec ---> 自己库的说明文件
├── Pod ---> 存放你库的类文件(验证spec时,此处重点)
│ ├── Assets
│ └── Classes
│ └── RemoveMe.[swift/m]
└── README.md ---> 说明文件,就是 GitHub 上的 README 文件
创建 podspec 文件
如果是使用 pod lib create MyLibrary
命令来创建的 pod 模板工程,那么模板中已经包含好了 podspec
文件了。
如果自己原有的 Demo 工程,只需要在项目的根目录使用 pod spec create [Name]
命令来创建对应的podspec 文件 官方文档在这里。
下面了解一下 podspec 文件的格式。
Pod::Spec.new do |s|
s.name = "XYInfomationSection" #名称
s.version = "0.1.0" #版本号
s.summary = "Just Testing." #简短介绍,下面是详细介绍
s.description = <<-DESC
Testing Private Podspec.
* Markdown format.
* Don't worry about the indent, we strip it!
DESC
s.homepage = "https://www.github.com/xiaoyouPrince/SectionDemo" #主页,这里要填写可以访问到的地址,不然验证不通过
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截图
s.license = 'MIT' #开源协议
s.author = { "xiaoyouPrince" => "xiaoyouPrince@gmail.com" } #作者信息
s.source = { :git => "https://www.github.com/xiaoyouPrince/SectionDemo.git", :tag => "0.1.0" } #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' #多媒体介绍地址
s.platform = :ios, '7.0' #支持的平台及版本
s.requires_arc = true #是否使用ARC,如果指定具体文件,则具体的问题使用ARC
s.source_files = 'Pod/Classes/**/*' #代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
s.resource_bundles = {
'PodTestLibrary' => ['Pod/Assets/*.png']
} #资源文件地址
s.public_header_files = 'Pod/Classes/**/*.h' #公开头文件地址
s.frameworks = 'UIKit' #所需的framework,多个用逗号隔开
s.dependency 'AFNetworking', '~> 2.3' #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
end
编辑完podspec
文件后,需要验证一下这个文件是否可用,如果有任何WARNING
或者ERROR
都是不可以的,它就不能被添加到Spec Repo
中,不过xcode
的WARNING
是可以存在的,验证需要执行一下命令
pod lib lint
当你看到
-> XYInfomationSection (0.1.0)
XYInfomationSection passed validation.
时,说明验证通过了,下面需要在本地验证这个 XYInfomationSection
pod 是否可用。
本地测试 podspec 文件
可以创建一个新项目,在这个项目中编辑 Podfile
文件,并指向自己Pod的具体路径,如下
pod 'XYInfomationSection', :path => '~/Desktop/podTest/SectionDemo' # 指定路径,注意格式不要出错,我就在这里采坑了
然后执行pod install
命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于 Development Pods/XYInfomationSection
中,这是因为我们是在本地测试,而没有把podspec
文件添加到Spec Repo
中的缘故。
然后就可以在项目中编写代码测试一下自己库的功能是否异常,测试无误就可以提交podspec
到Spec Repo
中了
向 Spec Repo 提交 podspec
提交到远程的 Spec Repo
必须要做的准备工作就是我们的创建好的工程文件必须要在 git 的版本控制之下,因为podspec
文件中获取Git版本控制的项目还需要tag
号,所以我们要打上一个tag
。
git tag -m "first release" 0.1.0 # 版本号需要和 podspec 中设置的版本一致
git push --tags #推送tag到远端仓库
准备完成这个之后就可以向 Spec Repo
提交 podspec
文件了。
向 Spec Repo
提交 podspec
需要确保 podspec
正确无误,我这里是提交到公有库,直接使用
pod lib lint # 在podspec文件的当目录,或者指定podspec路径
验证通过后在使用功能
pod trunk push # 在podspec文件的当目录,或者指定podspec路径
然后就可以等待发送到公共 Spec Repo
的结果了。如果成功你就可以自你的项目中如平时使用其他公开库一样使用自己的库了。
Note
trunk 工具使用之前需要和 CocoaPod 创建一个连接,使用的时候根据提示操作即可,创建连接后会有一封邮件传到你邮箱需要确认,确认后就可以使用发布的命令了
更新维护 Podspec
更新维护 podspec 就是在原有的 podspec 中更新内容,比如版本号,和项目资源依赖等。这个根据 podspec 相关的格式正确设置即可。。
我踩的坑和处理结果
这里简单记录一下我踩过的坑,和当时处理的方法。有些报错信息已经无法复现了,记录一个思路,日后回看的时候方便回忆。
下面主要是验证podspec
文件的问题,命令pod lib lint
1.podspec文件验证不通过,报编译错误问题
这里的编译错误实际上是你Podspec文件中要分享的源文件的编译,要确保自己的类文件能通过翻译。我当时感觉明明能编译通过,但是一直包编译错误,后面才想明白是源文件编译不过,我当时是因为少了依赖文件
2.缺少文件
公有的Pod上传必须要开源协议文件,项目中必须包含你的LICENSE,名字可以不一样,但是必须有开源协议
3.文件不匹配问题
验证过程中明明在对应的文件路径下放好了相应的文件,但是依然报,xxx路径下没有匹配到任何文件。。。
这个有两种情况
- 【本地检查】就是真的没有写对路径,这个需要仔细检查格式
- 【远程检查】如果是远程检查,你要明白这个检查是检查的你远程 git 仓库下面对应的路径,要确保已经上传到远程仓库。。。。。还有就是远程仓库不要忘记打Tag。因为podspec有一项要验证对应的版本号
4.验证的时候报错,找不到模拟器
这个问题比较坑,明明能看到有模拟器,但是验证的时候报找不到模拟器,他还很智能的提示在哪里找,要么创建一个之类的。心里真是醉了,后面发现是 pod 版本的问题。这个直接升级到最新版吧,这个就是版本问题
5.pod search 报错
发布自己Pod成功之后,发现pod search一直报错,一直是CDN之类的错误,或者是返回错误之类的。。这个问题是版本问题,CocoaPod 在1.7.2版本引入CDN,在1.8.0 正式将CDN设置为默认源。。。但是我不知道这个问题的时候,依据使用的之前版本1.5.3中的本地repo仓库下的源。。这就尴尬了,虽然我在验证阶段已经处理了几个版本相关的问题,升级到了最新版本,但是本地默认的repo源还在。。这就导致虽然用的新版Pod 但是源还是安装的旧版,在查找的时候依旧采用旧版的源。旧版的源上当然没有我想要查的内容了。。。这里想想应该是pod兼容方面的bug,我查了官方升级最新pod1.8+
的博客介绍中说,可以安全的移除旧有的臃肿的 master
源了,我参照移除所有源之后,重新 pod search
终于成功了
6. 关于开源库bundle的问题
这个问题发生在验证本地仓库能否可用的阶段。当我本地测试 podspec
并正确拉取我的开源文件后,写代码测试,发现崩了,因为内部我使用了bundle,代码中默认使用 mainBundle。但是开源代码经过pod管理,已经帮你封装到了一个独立的bundle中,所以有通过bundle创建的内容也就不能用了,这里属于代码问题,自行修改吧。
小结
这次的 pod 发布之旅踩了很多坑,一方面是因为我很久没有更新过,导致版本间差异过大,存在一些兼容问题。一方面是因为自己觉得英文太差,疏于查看最新的官方动态,错过了很多新信息。但是通过这次采坑让我更加熟悉了Pod的一些原理,最后成功搞定也让我增加了很多信心。以后要多看官方文档,增加正面信息的录入,多多学习新技术。希望以后能将自己开发的好用的小工具都开源出来供更多的人使用!
网友评论