【iOS 开发】创建 podspec 文件,给自己写的框架添加 CocoaPos 支持

最近想将自己写的框架支持 CocoaPods 集成,弄了好久,遇到了不少坑,所以想把方法记录下来,希望可以帮助大家少走一些坑,包括私有库的创建以及私有库依赖私有库的坑都已经写在下面了。


1. 将框架源码提交到 GitHub

想要添加 CocoaPods 支持必须将源码提交至 GitHub ,至于怎么提交相信大家都会,就不重复了。

注意:在创建 GitHub 仓库的时候,下面的 License 许可证 必须选择 MIT License ,不能为 None ,否则验证会报错,在下面会用到。

MIT License

下图是我的项目目录结构,上面选择了 MIT License 后,项目目录中会多一个 LICENSE 的文件,没有就按照上面说的重新建一下仓库,这个文件必须要有,GZZEditView 目录中的文件就是我要添加 CocoaPods 支持的文件。

目录结构

2. 创建 podspec 文件

  • 用终端 cd 到你的项目目录并执行以下命令:( GZZEditView 的位置换成你框架的名称,也是之后 pod search 的名称)
1
pod spec create GZZEditView
  • 这时候,项目目录中会生成一个 .podspec 的文件。

 .podspec 文件

3. 编辑 podspec 文件

这一步非常重要,能不能验证通过就主要看这个文件的内容编辑是否正确了,作者就在这里耗了很久,总是验证报错。

  • 用编辑器打开 .podspec 的文件,将内容全部删除,然后将以下内容复制进去,这里只用到一部分必须的字段,如果需要设置更多字段,点击这里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Pod::Spec.new do |s|
s.name = 'GZZEditView'
s.version = '1.0.0'
s.summary = '非常简单易用的轻量级编辑框。'
s.homepage = 'https://github.com/Jonzzs/GZZEditView'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Jonzzs' => '292710547@qq.com' }
s.social_media_url = 'http://weibo.com/Jonzzs'
s.source = { :git => 'https://github.com/Jonzzs/GZZEditView.git', :tag => s.version }
s.source_files = 'GZZEditView/*.{h,m}'
s.resource_bundle = { 'GZZEditView' => ['Resources/**/*.xcassets'] }
s.platform = :ios
s.ios.deployment_target = '9.0'
s.dependency 'Masonry'
s.subspec 'GroupName' do |s|
...
end
end
  • 开始修改其中的内容,下面讲解一下各字段的含义,xxx 处就是需要修改的内容。
1
s.name = 'xxx' :框架名称,也是 pod search 搜索的关键词,并且一定要和 .podspec 文件的名称一样,否则验证报错。
1
s.version = 'xxx' :框架版本号。
1
s.summary = 'xxx' : pod search 搜索框架时,显示的框架简介。
1
s.homepage = 'xxx' :项目主页地址.
1
s.license = { :type => 'MIT', :file => 'LICENSE' } :许可证,这里就这样写不用修改。
1
s.author = { 'xxx' => 'xxx' } :作者,前面填你的英文名,后面填你的个人邮箱。
1
s.social_media_url = 'xxx' :社交网址,我填的是我的个人微博地址。
1
s.source = { :git => 'xxx', :tag => s.version } :GitHub 项目的仓库地址,这里只支持 HTTPS ,不支持 SSH 。
1
2
3
4
5
6
7
8
9
10
s.source_files = 'xxx/*.{h,m}' :要添加 CocoaPods 支持的文件路径。
几种写法:
s.source_files = 'xxx/*'
s.source_files = 'xxx/*.{h,m}'
s.source_files = 'xxx/**'
'*':表示匹配所有文件
'*.{h,m}':表示匹配所有以 .h.m 结尾的文件
'**':表示匹配所有子目录
1
2
3
4
5
6
7
8
9
10
11
s.resource_bundle = { 'xxx' => ['xxx/**/*.xcassets'] } :要添加 CocoaPods 支持的图片资源,这个是我后补的所以 Demo 截图中没有这个,可以根据自己需求写。
如果要在主工程中使用 pod 中的图片,方法如下:
// 假如 podspec 中定义的 Bundle 名字为 TestBundle
s.resource_bundle = { 'TestBundle' => ['xxx/**/*.xcassets'] }
// 这里就用 Swift 写一下,OC 方法是一样的
let url = Bundle(for: View.self).resourceURL!
let bundle = Bundle(url: url.appendingPathComponent("TestBundle.bundle"))
let image = UIImage(named: "imageName", in: bundle, compatibleWith: nil)
1
s.platform = :ios :所属平台,这边不用更改。
1
s.ios.deployment_target = '9.0' :最低支持的 iOS 版本
1
2
3
4
5
6
7
8
9
s.dependency 'xxx' :项目依赖的其他 pod 库,不能依赖未发布的库,版本号可以不写。
多个依赖可以这样写:
s.dependency 'xxx'
s.dependency 'xxx'
s.dependency 'xxx'
指定版本可以这样写:
s.dependency 'xxx', '1.0.0'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
s.subspec 'xxx' do |s|
end
表示建立一个名字为 xxx 的子文件夹,可以将文件分类,我上面用 ... 跳过了,不需要可以不写,里面写法和外面是一样的,例如:
s.subspec 'xxx' do |s|
s.source_files = 'xxx/*.{h,m}'
s.resource_bundle = { 'xxx' => ['xxx/**/*.xcassets'] }
end
注意:不同子文件夹下 source_files 中的文件是单独编译的,如果文件中引入了别的子文件夹下的代码是编译不通过的。

4. 验证 podspec 文件

podspec 文件修完完成以后,command + s 保存一下,接下来开始验证。

  • 依旧用终端 cd 到你的项目目录,刚才终端没关的话,就直接执行以下命令:
1
pod lib lint
  • 如果是如下图提示只有 warning 错误,并提示 but you can use '--allow-warnings' to ignore them 的话,就执行以下命令忽略 warning 来验证:
1
pod lib lint --allow-warnings

验证 podspec 文件失败

  • 如果提示有 error 错误的话,就必须按照提示将错误解决掉,大多数都是 podspec 文件信息编辑有误,解决完后重新进行验证,如果提示信息不足,可以执行以下命令以获取更多错误信息:
1
pod lib lint --verbose
  • 如果出现如下图的 GZZEditView passed validation. 就是验证成功了。

验证 podspec 文件成功

  • 如果是 Swift 程序,有时候验证会报一大堆错误,原因是 xcodebuild 编译时使用的 Swift 版本和你代码当前使用的版本可能不一样,这时候就需要指定一下 Swift 版本,指定方法是在 podspec 同目录下创建一个 .swift-version 的文件,在里面写上 Swift 版本即可,例如 4.0 ,在终端输入以下命令也可以创建,创建完以后在执行 pod lib lint 就可以编译通过了。
1
echo "4.0" >> .swift-version

5. 给项目打上 tag 版本

因为 CocoaPods 是依赖项目的 tag 版本的,所以必须打上 tag 版本。

  • podspec 文件验证成功后,先将改动后的文件 commit 提交,接着 push 推送到 GitHub
  • 然后执行以下命令打上 tag 版本,版本名必须要和之前podspec 文件中的 s.version 一致。
1
2
git tag "1.0.0" // 为 git 提交打上 tag
git push --tags // 将 tag 推送到远程仓库

6. 注册 trunk

如果只想发布到私有 CocoaPods 仓库,可以跳过 6、7、8 步直接看第 9 步。

注意: trunk 需要 CocoaPods 0.33 版本以上,如果版本太低,就先把 CocoaPods 版本升级一下,具体怎么升级这里就不说了。

  • 已经注册过 trunk 的就不需要注册了,执行以下命令查看自己有没有注册过:
1
pod trunk me
  • 出现以下注册信息就代表已经注册过 trunk 了。

 trunk 注册信息

  • 如果没有就执行以下命令来注册 trunk ,前面填写你的个人邮箱地址,后面填写你的英文名字。
1
pod trunk register xxx "xxx"

例如:

1
pod trunk register 292710547@qq.com "Jonzzs"
  • 执行注册命令完成之后,会验证注册邮箱,给你填的邮箱地址发送一个邮件,进入邮件打开里面的链接,弹出网页后就注册成功了。

注册邮箱验证

7. 发布到 CocoaPods

依旧先 cd 到你的项目目录,接着要注意的是,发布时会再次验证你的 podspec 文件,如果刚才验证时使用了 --allow-warnings ,那么发布的时候也应该使用,否则会出现相同的报错,GZZEditView 改成你自己 podspec 文件的名字。

  • 如果刚才是用 pod lib lint 验证成功的,就执行以下命令发布:
1
pod trunk push GZZEditView.podspec
  • 如果刚才是用 pod lib lint --allow-warnings 验证成功的,就执行以下命令发布:
1
pod trunk push GZZEditView.podspec --allow-warnings
  • 最后出现如下图所示,就表示发布成功了。

发布成功

8. 赶快验证一下吧

  • 执行以下命令搜索你的 pods 库:
1
pod search GZZEditView
  • 不出意外的话就会显示出你刚才发布的框架:

GZZEditView

  • 若是 trunk push 成功了,却搜索不到自己的框架,解决方法参考我的另一篇文章 传送门

9. 发布到私有仓库

  • 发布之前需要先创建一个用来存放私有库的 Git 仓库,然后将仓库 git clone~/.CocoaPods/repo 这个目录。

  • 然后在终端输入 pod repo 就可以看到除了有一个 master 的官方库以外,还多了一个自己的私有仓库。

  • 然后依旧先 cd 到你的项目目录,接着要注意的是,发布时会再次验证你的 podspec 文件,如果刚才验证时使用了 --allow-warnings ,那么发布的时候也应该使用,否则会出现相同的报错,fmone 是我自己私有仓库的名字,需要改成你自己的名字,GZZEditView 改成你自己 podspec 文件的名字。

  • 如果刚才是用 pod lib lint 验证成功的,就执行以下命令发布:

1
pod repo push fmone GZZEditView.podspec
  • 如果刚才是用 pod lib lint --allow-warnings 验证成功的,就执行以下命令发布:
1
pod repo push fmone GZZEditView.podspec --allow-warnings
  • 最后出现如下图所示,就表示发布成功了。

  • 如要项目中要使用私有仓库来 pod install ,必须在 podfile 开头指明私有仓库的地址和官方仓库地址,注意两个地址都要指定,例如:
1
2
3
4
5
6
7
8
9
10
11
source 'https://github.com/CocoaPods/Specs.git' # 公共仓库地址
source 'https://github.com/Jonzzs/xxx.git' # 私有仓库地址
target 'TestProject' do
# 第三方库
pod 'Masonry'
# 私有库
pod 'xxx'
end

10. 私有库依赖私有库

这个情况就比较特殊了,如果私有库中依赖了另一个私有库,podspec 文件中依旧要使用 s.dependency 'xxx' 来指明依赖的私有库,但是在验证 podspec 时就不能使用 pod lib lint 来验证了,否则会找不到依赖的私有库,需要从远程验证并指定私有库的地址,下面是验证步骤。

  • podspec 文件的编辑没有区别,编辑完以后,由于需要远程验证而不是本地验证,所以需要先将编辑完的 podspec 文件 git push 再打上 tag

  • 然后使用以下命令开始验证,后面指明私有仓库的地址和官方仓库地址,注意两个地址都要指定。

1
pod spec lint --sources='私有仓库地址,https://github.com/CocoaPods/Specs.git' --allow-warnings
  • 验证成功后发布到私有仓库时,也需要指明私有仓库的地址和官方仓库地址,如下。
1
pod repo push fmone xxx.podspec --sources='私有仓库地址,https://github.com/CocoaPods/Specs.git' --allow-warnings


好了,大功告成,其实过程挺简单的,只要 podspec 文件编辑正确,就会少走很多坑,以后再次更新框架的话,只需要修改 podspec 文件中的 s.version 版本,然后把你的项目再打一个 tag 版本,接着再次提交到 CocoaPods 就可以了。

将来的你,一定会感激现在拼命的自己,愿自己与读者的开发之路无限美好。

我的传送门: 博客简书微博GitHub

如果觉得我的文章对您有用,请随意打赏吧,您的支持将鼓励我继续创作!
0%