iOS 开发iOS劝退指南iOS第三方库

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

2017-04-14  本文已影响677人  爱吃鸭梨的猫
CocoaPods

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


1. 将框架源码提交到 GitHub

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

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

MIT License

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

目录结构

2. 创建 podspec 文件

pod spec create GZZEditView
.podspec 文件

3. 编辑 podspec 文件

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

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
s.name = 'xxx' :框架名称,也是 pod search 搜索的关键词,并且一定要和 .podspec 文件的名称一样,否则验证报错。
s.version = 'xxx' :框架版本号。
s.summary = 'xxx' : pod search 搜索框架时,显示的框架简介。
s.homepage = 'xxx' :项目主页地址.
s.license = { :type => 'MIT', :file => 'LICENSE' } :许可证,这里就这样写不用修改。
s.author = { 'xxx' => 'xxx' } :作者,前面填你的英文名,后面填你的个人邮箱。
s.social_media_url = 'xxx' :社交网址,我填的是我的个人微博地址。
s.source = { :git => 'xxx', :tag => s.version } :GitHub 项目的仓库地址,这里只支持 HTTPS ,不支持 SSH 。
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 结尾的文件
'**':表示匹配所有子目录
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)
s.platform = :ios :所属平台,这边不用更改。
s.ios.deployment_target = '9.0' :最低支持的 iOS 版本
s.dependency 'xxx' :项目依赖的其他 pod 库,不能依赖未发布的库,版本号可以不写。

多个依赖可以这样写:
s.dependency 'xxx'
s.dependency 'xxx'
s.dependency 'xxx'

指定版本可以这样写:
s.dependency 'xxx', '1.0.0'
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 保存一下,接下来开始验证。

pod lib lint
pod lib lint --allow-warnings
验证 podspec 文件失败
pod lib lint --verbose
验证 podspec 文件成功
echo "4.0" >> .swift-version

5. 给项目打上 tag 版本

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

git tag "1.0.0" // 为 git 提交打上 tag
git push --tags // 将 tag 推送到远程仓库

6. 注册 trunk

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

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

pod trunk me
trunk 注册信息
pod trunk register xxx "xxx"

例如:

pod trunk register 292710547@qq.com "Jonzzs"
注册邮箱验证

7. 发布到 CocoaPods

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

pod trunk push GZZEditView.podspec
pod trunk push GZZEditView.podspec --allow-warnings
发布成功

8. 赶快验证一下吧

pod search GZZEditView
GZZEditView

9. 发布到私有仓库

image
pod repo push fmone GZZEditView.podspec
pod repo push fmone GZZEditView.podspec --allow-warnings
image
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 来验证了,否则会找不到依赖的私有库,需要从远程验证并指定私有库的地址,下面是验证步骤。

pod spec lint --sources='私有仓库地址,https://github.com/CocoaPods/Specs.git' --allow-warnings
pod repo push fmone xxx.podspec --sources='私有仓库地址,https://github.com/CocoaPods/Specs.git' --allow-warnings
image

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读