一个简单的spec文件如下
Pod::Spec.new do |s|
s.name = '框架名'
s.version = '0.1.0'
s.summary = 'A short description of ZYTemplateName.'
s.homepage = 'https://github.com/ripperhe/ZYTemplateName'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { '框架作者' => '作者邮箱' }
s.source = { :git => 'https://github.com/ripperhe/ZYTemplateName.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = '框架名/Classes/*/'
end
先进入需要发布的框架的根目录,执行
$ pod spec create [NAME]
这里的 NAME 即为框架名字,不需要手动加 .podspec 后缀。执行完成之后,会生成 NAME.podspec 文件,进入该文件,将对应信息改为你具体的信息即可。
如果你发现你的 spec 文件默认填写的用户名和邮箱不是你刚才利用 trunk 命令注册账号时候填写的不用惊讶,因为默认取的是 git 的用户名和邮箱,所以想修改的话,去修改 ~/.gitconfig 文件中的用户名和邮箱。以下为相关源码:
def default_data_for_template(name)
data = {}
data[:name] = name
data[:version] = '0.0.1'
data[:summary] = "A short description of #{name}."
data[:homepage] = "http://EXAMPLE/#{name}"
data[:author_name] =git config --get user.name
.strip
data[:author_email] =git config --get user.email
.strip
data[:source_url] = "http://EXAMPLE/#{name}.git"
data[:ref_type] = ':tag'
data[:ref] = '#{s.version}'
data
end
spec 文件的这些描述,基本上看命名是可以看明白的。实在不明白可以查看 官方文档https://guides.cocoapods.org/syntax/podspec.html#specification
需要注意的是,s.version 是你将要发布的 pod 仓库的版本,s.source 是你的仓库源地址和对应的 tag 信息。
version 和 tag 可以是不同的,但是为了方便管理和维护,我们一般将其设置为一样的,所以 tag 可以 直接使用 s.version.to_s。既然这里用到了 tag,那么接下来,就需要为仓库代码打上 tag。
提交代码并为框架打 tag
首先,需要将本仓库的所有修改提交到远程仓库。
$ git add .
$ git ci -m 'release pod'
$ git push
上一步在仓库的根目录创建了 spec 文件,随着代码的提交,spec 文件也会提交到自己的远程代码仓库。这个 spec 文件和需要发布的框架放在一起并不是必须,只是这样可以方便我们以后维护这个框架。
发布 pod 仓库,需要和自己框架的远程仓库代码版本对应,所以这里需要为当前代码打上 tag,这个 tag 是和前面的 spec 文件中填写的 tag 对应的。框架发布成功之后,CocoaPods 会根据 tag 信息去获取相应代码。
$ git push origin master
$ git tag '0.1.0'
$ git push --tags
验证 spec 文件
用于验证 spec 文件是否正确,可以及早发现问题。同样,也是在需要发布的框架的根目录,执行
$ pod spec lint NAME.podspec
这里需要加上 .podspec 后缀来验证这个文件。如果有报错,仔细查看报错信息,一般可以定位问题,可以加上 --verbose 查看详细的验证过程,方便定位问题。
$ pod spec lint NAME.podspec --verbose
验证 spec 文件也可以用另外一个命令
$ pod lib lint NAME.podspec
pod spec lint 和 pod lib lint 最主要的区别是,前者会根据 spec 文件 tag 信息去验证远程仓库代码是否存在,后者不会。简单理解就是,pod spec lint 联网检查,pod lib lint 不联网检查。
验证的时候,可能会报错,或是报警告。报错的话,必须解决,详细看具体信息,一般能找到问题,如果不能,自行 google 😁。警告的话,可以忽略,不过能解决的话,最好解决。
$ pod lib lint ZYTemplateName.podspec --allow-warnings
推送 spec 文件
验证文件通过之后,需要将文件推送到 CocoaPods 描述文件仓库,在框架根目录,执行以下命令:
$ pod trunk push NAME.podspec
这个命令,可以不在后面加描述文件名称,如果不加的话,会在终端当前工作目录下查找 .podspec 文件,执行 trunk push 命令。
这一步稍微会久一点,需要等待一会儿,因为 CocoaPods 需要先将 spec 文件上传到 CocoaPods/Specs 仓库,再 git pull 到本地 CocoaPods/Specs 仓库。等待显示成功之后,可以验证以下自己的框架是否真的发布成功了。搜索一下:
$ pod search [NAME]
如果搜索不到,可能是仓库的索引库出现问题,将其删除,重新生成索引。索引缓存地址:
~/Library/Caches/CocoaPods/search_index.json
如果这样还不行,有可能是官方的 spec 仓库 出现问题。官方 spec 仓库路径:
~/.cocoapods/repos/master
将其删除,再重新克隆官方的 spec 仓库:
$ pod setup
这个时候再试试 pod search 应该就有了。
对于公司内部使用的组件模块,一般是不公开的,所以就需要用到私有 sepc 仓库。
将代码发布到私有仓库和 CocoaPods 官方库最大的区别就是,不需要利用 trunk 命令创建 session。既然整个私有库都是你的,所以也没有必要再有账号机制了,自己想怎样就怎样。
少做了一件事情,但也有额外的事情需要做。前面 spec 文件都是 CocoaPods 帮你管理的,所以做私有 pod,就需要创建私有 spec 仓库。
整体流程如下:
安装 CocoaPods
创建远程私有 spec 仓库
克隆远程私有 spec 仓库到本地
创建 spec 文件
提交代码并为框架打 tag
验证 spec 文件
通过 pod repo push 推送 spec 文件
很多流程是相同的,相同的流程一笔带过。
另一种方式
1. 执行命令
projectName--项目名称
pod lib create projectName
2. 选项设置
What language do you want to use?? [ Swift / ObjC ]
ObjC
Would you like to include a demo application with your library? [ Yes / No ]
Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Kiwi
Would you like to do view based testing? [ Yes / No ]
No
What is your class prefix?
项目缩写