文章

CocoaPods - 发布 podspec 到 repo

pod-preview

本篇文章我将通过一个名叫 FlyHUD 的开源组件来讲解如何提交 podspec 到共有 Specs Repo。

验证组件名

因为 Specs Repo 里的每个组件不能重名,所以我们在创建组件之前先验证一下组件名称是否已被使用。

方法一:在 cocoapods.org 官网搜索组件名

方法二:在终端输入一下命令

1
pod search 组件名  # 例如:pod search FlyHUD

创建代码仓库

点击此链接将跳转到 Github 去创建一个 Public 代码仓库。

github-create-repo-light github-create-repo-dark

创建组件工程

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

如果你需要从零开始创建一个组件库,那么我建议你使用 Cocoapods 提供的一个工具将后两步结合起来做。

这个工具详细使用说明请参考官网 Using Pod Lib Create,也可以查看 Github,它是一个开源工具。

这里以 FlyHUD 为例,打开终端 cd 到要创建项目的目录然后执行:

1
pod lib create FlyHUD

之后他会问你五个问题:

  1. 选择创建 iOS 或 macOS 工程;
  2. 选择用 Swift 或 ObjC;
  3. 是否需要 demo 工程;
  4. 选择一个测试框架;
  5. 是否需要基于 View 测试。

我这里选择的是 1. iOS;2. Swift;3. Yes;4. None;5. No。问完这五个问题后他会自动创建一个 pod 组件工程,并且自动执行 pod install 命令生成依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ tree FlyHUD -L 2
FlyHUD
├── Example
│   ├── FlyHUD
│   ├── FlyHUD.xcodeproj
│   ├── FlyHUD.xcworkspace
│   ├── Podfile
│   ├── Podfile.lock
│   ├── Pods
│   └── Tests
├── LICENSE
├── FlyHUD
│   ├── Assets
│   └── Classes
├── FlyHUD.podspec
├── README.md
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj

10 directories, 5 files

以上是生成的项目的目录结构。如果你不想使用这个目录结构则可以试试我这个工具 pod-project-template

接下来就是分别向 FlyHUD/ClassesFlyHUD/Assets 文件夹中添加代码文件和资源,并配置 FlyHUD.podspec 文件,然后进入 Example 文件夹执行 pod install 命令,再打开项目工程可以看到,刚刚添加的组件已经在 Pods 子工程下 Development Pods/FlyHUD 中了,然后编辑 demo 工程和测试案例。

每当你向 Pod 中添加了新的文件或者更新了 podspec 都需要重新执行 pod install 命令。

编辑 podspec 文件

上面有提到,如果你不是用 pod lib create 创建的工程,那么就需要创建一个 podspec 文件。

打开终端 cd 到 FlyHUD 项目根目录,并输入一下命令:

1
pod spec create FlyHUD

执行完之后,就创建了一个 podspec 文件,它包含很多配置项,具体怎么编辑请继续往下阅读。

FlyHUD 替换成你自己的组件名,此命令详细介绍可查看官方文档

下面是我的一个 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
36
37
38
39
40
41
42
43
44
45
46
47
48
Pod::Spec.new do |s|

# 你的组件名称
s.name         = "FlyHUD"

# 组件版本号
s.version      = "1.0.0"

# 组件的简短介绍
s.summary      = "The Swift version of FlyHUD."

# 组件的详细介绍
s.description  = <<-DESC
TODO: Add long description of the pod here.
                    DESC

# 组件的主页,一般为 Github 地址就行(如果地址无法访问,则 podspec 文件将验证不通过)
s.homepage     = "https://github.com/liam-i/FlyHUD"

# 开源协议
s.license      = "MIT"

# 组件的作者信息:{ "作者名" => "邮箱" }
s.author       = { "liam-i" => "liam_i@163.com" }

# 组件最低支持的 iOS 系统版本号
s.ios.deployment_target = '10.0'

# 组件地址,只支持 HTTP 和 HTTPS,最好使用HTTPS
s.source       = { :git => "https://github.com/liam-i/FlyHUD.git", :tag => "#{s.version}" }

# 组件的源代码的路径
s.source_files = "FlyHUD/Classes/*.swift"

# 资源文件地址
s.resource_bundles = {
  'FlyHUD' => ['FlyHUD/Assets/*.png']
}

# 公开头文件地址
s.public_header_files = 'FlyHUD/Classes/**/*.h'

# 所需的framework,多个用逗号隔开
s.frameworks = 'UIKit', 'MapKit'

# 组件所依赖的其他库,如果有多个需要填写多个 s.dependency
s.dependency 'AFNetworking', '~> 2.3'
end

推送到远端仓库

podspec 文件编辑完成之后,需要将该项目添加并推送到远端仓库。

在文章第二部分,我们已经在 GitHub 上创建了一个 FlyHUD 代码仓库,我们就推送到这里。打开终端 cd 到本地 FlyHUD 根目录,执行以下命令:

1
2
3
4
5
6
7
git add .
git commit -m "Initial Commit"
git remote add origin git@github.com:liam-i/FlyHUD.git # 添加远端仓库
git push origin main     # 提交到远端仓库

git tag -m "release v0.1.0" 0.1.0  # podspec 文件中获取 Git 版本控制的项目需要 tag 号
git push --tags     # 推送 tag 到远端仓库

详细的 Git 使用教程可查看【Git一个先进的分布式版本控制系统】

验证 podspec 文件

把项目推送到远端代码仓库之后,我们就可以验证 podspec 文件是否可用,打开终端 cd 到 podspec 文件所在目录,并执行一下命令:

1
pod spec lint FlyHUD.podspec

当你看到一下结果,说明验证通过了。

1
2
3
 -> FlyHUD (0.1.0)

FlyHUD passed validation.

如果验证有任何 warning 或 error 都是不可以的,它就不能被添加到 Specs Repo 中,不过 xcode 的 warning 是可以存在的。

测试 podspec 文件

当 podspec 文件验证通过后,我们还需要验证 Pod 组件是可以用的,接下来我们在本地做个验证。

如果你是用 pod spec create 创建的工程,则直接 cd 到 Podfile 文件目录下执行 pod install 即可。

如果你不是用 pod spec create 创建的工程,则需要创建一个新的项目,在新项目的 Podfile 文件中直接指定刚才编辑好的 podspec 文件,在 Podfile 中我们可以这样编辑:

1
2
3
4
5
6
use_frameworks!
platform :ios, '10.0'

target 'FlyHUD_Example' do
  pod 'FlyHUD', :path => '../'  # 指定 podspec 文件所在路径
end

编辑好 Podfile 文件后,cd 到 Podfile 文件目录下执行 pod install 即可。

pod install 执行完毕,且没报错。打开项目工程,可以看到文件都被加载到 Pods 子项目的 Development Pods/FlyHUD 中了,这时你编译一下工程,不报错即可。

向 Public Spec Repo 提交 podspec

注册作者信息

第一次提交时,需要先注册你的信息:

1
pod trunk register liam_i@163.com 'Liam' --description='FlyHUD de description.'
  • 注意替换你的邮箱、用户名 和 组件描述。
  • pod trunk register 你的邮箱 ‘你的用户名’ –description=’你的描述’

注册成功的话就会收到一份邮件,点击邮件中的链接后验证一下。

我们也可以直接使用以下命令查看个人信息是否注册成功:

1
pod trunk me

注册成功的话会返回以下结果:

1
2
3
4
5
6
7
8
$ pod trunk me
  - Name:     Liam
  - Email:    liam_i@163.com
  - Since:    December 5th, 08:24
  - Pods:
    - FlyHUD
  - Sessions:
    - December 5th, 08:24 - April 12th, 2022 12:34. IP: 103.206.191.69

如果你的 pod 组件是由多人维护的,你也可以添加其他维护者:

1
pod trunk add-owner POD OWNER-EMAIL

例如,我们需要添加一个维护者 liam_i_other@163.com 则可以这样输入:

1
pod trunk add-owner FlyHUD liam_i_other@163.com

提交 podspec

注册完维护者信息之后,cd 到 podspec 文件所在目录:

1
  pod trunk push FlyHUD.podspec

push 指令会先验证 podspec 文件是否有合法,验证通过后再提交到 Repo,最后会将上传的 podspec 转换为 json 文件。

如果提交成功,会输出以下结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
Updating spec repo `trunk`
Validating podspec
  -> FlyHUD (0.1.0)

Updating spec repo `trunk`

--------------------------------------------------------------------
 🎉  Congrats
 🚀  FlyHUD (0.1.0) successfully published
 📅  December 5th, 08:24
 🌎  https://cocoapods.org/pods/FlyHUD
 👍  Tell your friends!
--------------------------------------------------------------------

详细的教程:Getting setup with Trunk

向 Private Spec Repo 提交 podspec

添加 Private Spec Repo

1
pod repo add REPO_NAME SOURCE_URL # E.g.: pod repo add liam-components 'git@github.com:liam-i/liam-components.git'

检查添加的 Private Spec Repo 是否有效:

1
2
cd ~/.cocoapods/repos/REPO_NAME # E.g.: cd ~/.cocoapods/repos/liam-components
pod repo lint .

提交 podspec

1
pod repo push REPO_NAME SPEC_NAME.podspec # E.g.: pod repo push liam-components FlyHUD.podspec

详细的教程:Private Pods

从 Specs Repo 搜索组件

将 podspec 提交到 Specs Repo 后,我们需要搜索一下来验证制作好的 pod 组件可以被正常使用。

打开终端,输入一下命令:

1
pod search FlyHUD

搜索成功

1
2
3
4
5
6
-> FlyHUD (0.1.0)
   A short description of FlyHUD.
   pod 'FlyHUD', '~> 0.1.0'
   - Homepage: https://github.com/liam-i/FlyHUD
   - Source:   https://github.com/liam-i/FlyHUD.git
   - Versions: 0.1.0 [trunk repo]

如果搜索不到,可执行以下命令:

1
pod setup    # 更新pod库

如果 pod setup 成功后还是无法 pod search 可执行以下命令:

1
2
3
cd ~/Library/Caches/CocoaPods  # 进入 CocoaPods 的缓存文件夹
rm search_index.json           # 删除 search_index.json 文件
pod search FlyHUD              # 执行搜索命令,并重新生成 search_index.json 文件

维护 podspec

当一个 pod 组件库制作好了,以后肯定需要更新维护的。比如如何升级 pod 版本,如何删除 pod 组件库。

升级 pod 组件版本,步骤还是和上面介绍的一样。

  1. 分别在 FlyHUD/ClassesFlyHUD/Assets 文件夹中添加、修改代码文件和资源
  2. 配置 FlyHUD.podspec 文件,比如 Classes、Assets、frameworks、ependency 和 version 等等
  3. 进入 Example 文件夹执行 pod install 验证 pod 组件是否可用
  4. pod lib lint 验证 podspec 是否合法
  5. 推送到远端代码仓库,并打 tag
  6. 提交 podspec 到共有 Specs Repo

删除已发布的 pod 组件库,可用使用以下命令:

1
pod trunk delete NAME VERSION

以上命令需要指定组件名,和组件版本号。例如:pod trunk delete FlyHUD 0.1.0

  • 删除 pod 组件通常被认为是不好的行为,如果别人正在使用你的 pod 组件,使用 delete 会给别人带来一定的麻烦,所以请慎重考虑是否可用使用 deprecate 命令。
  • 当你的 pod 组件版本被删除之后,此版本将永远无法再次提交到 Specs Repo
本文由作者按照 CC BY 4.0 进行授权

© Liam. 保留部分权利。

本博客由 Jekyll 生成,使用 Chirpy 作为主题