制作集成了一个认证,分享,支付的库,也上载到了github,之前一直想做一个自己的pod库,根据网上的教程,走了一些坑,总算折腾完了(写这个文章的时候其实应该还在部署,有点小激动)
1.Github
创建自己的Repository,我创建了QShare,然后从本地上传到github上, 这些步骤就不在这里赘述了,经常跑github的同学应该都会。
2.建tag
打开终端,cd 到项目QShare目录下,
git tag '1.0.0'//这个命令是本地创建tag,1.0.0版本
git push --tags // 这个命令是把tag推送到远端。
3.创建项目的podspec文件
现在终端还是在项目QShare的目录下,执行以下命令
$ pod spec create QShare
在本地目录下同时也生成了QShare.podspec文件
$ vim QShare.podspec
编辑podspec文件,会发现这个文件已经生成了部分的字段
以下是编辑好的podspec 文件 做一些解释
Pod::Spec.new do |s| #spec开始 s作为spec的别名
s.name = "QShare" #项目名称
s.version = "1.0.0" #版本号,
s.summary = "Gather Some Auth Share Pay." #简介
s.homepage = "https://github.com/quankevin/QShare" #github,或者别的开源代码地址
s.license = "MIT" #遵循的开源协议
s.author = { "quankevin" => "quankevin@163.com" } #作者
s.social_media_url = "http://weibo.com/quankevin" #作者联系
s.platform = :ios, "7.0" #对应的ios平台
s.source = { :git => "https://github.com/quankevin/QShare.git", :tag => "#{s.version}" } #代码的git源地址 这里的tag=>"#{s.version}" 引用了上面的s.version 如果,在打tag的时候是用的 git tag 'v1.0.0' 那么这里需要使用 tag => "v#{s.version}"
s.frameworks = "SystemConfiguration","UIKit","CoreTelephony" #项目需要用到的ios framework
s.libraries = "stdc++", "sqlite3","z" #项目需要用到的库
s.requires_arc = true #arc
s.public_header_files = "QShare/QShareHeader.h" #公用的一些头文件
s.subspec 'Core' do |core| #定义一个Core
core.source_files = "QShare/*.{h,m}" #指定Core的路径
end #结束定义Core
s.subspec 'WeChat' do |wechat| #定义微信
wechat.dependency 'QShare/Core' #需要上面的Core
wechat.source_files = "QShare/Wechat/*.{h,m}" #微信的库
wechat.vendored_libraries = "QShare/Wechat/*.a" #封装了微信的.a
end #结束
s.subspec 'Weibo' do |weibo|
weibo.dependency "WeiboSDK" #这里是直接引用了微博的cocoapod
end
s.subspec 'Tencent' do |qq|
qq.dependency 'QShare/Core'
qq.source_files = "QShare/Tencent/*.{h,m}"
qq.vendored_frameworks = "QShare/Tencent/SDK/TencentOpenAPI.framework" #指定framework 的路径
end
s.subspec 'Ali' do |ali|
ali.dependency 'QShare/Core'
ali.source_files = "QShare/Ali/*.{h,m}"
ali.resources = "QShare/Ali/SDK*.bundle" #指定了ali 的非代码资源
ali.vendored_frameworks = "QShare/Ali/SDK/AlipaySDK.framework"
end
end
编辑好podspec文件后,需要验证一下这个文件是否能通过编译。
$ pod spec lint QShare.podspec --verbose
然而并没有通过
- ERROR | [iOS] Encountered an unknown error (The'Pods'target has transitive dependencies that include static binaries: (/private/var/folders/bw/c_n89d1n6xqffn525kp80000gn/T/CocoaPods/Lint/Pods/WeiboSDK/libWeiboSDK/libWeiboSDK.a)) during validation.
找了一些相关的,这个错误是因为依赖库(s.dependency)包含了.a静态库造成的。虽然这并不影响Pod的使用,但是验证是无法通过的。可以通过 --use-libraries 来让验证通过。使用以下的命令:
$ pod spec lint QShare.podspec --verbose --use-libraries
然而这种情况下使用 --use-libraries 虽然不会出现错误(error),但是有时候会带来一些警告(waring),警告同样是无法通过验证的。这时可以用 --allow-warnings 来允许警告。
$ pod spec lint QShare.podspec --verbose --use-libraries --allow-warnings
静候佳音----终于通过了。
提交到pod
发布时也会验证 Pod 的有效性,如果你在手动验证 Pod 时使用了 --use-libraries 或 --allow-warnings 等修饰符,那么发布的时候也应该使用相同的字段修饰,否则出现相同的报错。
发布成功后,终于可以使用 pod search 搜索到自己的 Pod 了。
➜tieguan pod search QShare
-> QShare (1.0.0)
Gather Some Auth Share Pay.
pod 'QShare', '~> 1.0.0'
- Homepage: https://github.com/quankevin/QShare
- Source:https://github.com/quankevin/QShare.git
- Versions: 1.0.0 [master repo]
- Subspecs:
- QShare/Core (1.0.0)
- QShare/WeChat (1.0.0)
- QShare/Weibo (1.0.0)
- QShare/Tencent (1.0.0)
- QShare/Ali (1.0.0)
版本升级
当需要更新 Pod 版本的时候,修改 .podspec 中的 s.version 为更高的版本号,并修改 s.source 中对应的 Git 版本。提交到Git,并打上对应tag。然后再次执行pod trunk push QShare.podspec将新的 .podspec 发布到 CocoaPods。更新完成!
为了更方便的修改版本号,用了以下的语句:
s.source = { :git => "https://github.com/quankevin/QShare.git", :tag => "v#{s.version}" }
这样与 s.version进行了绑定,每次提交新的版本只需要修改s.version = "xxxx"。
如有不明白的或者错误的地方,请大家指出,我会将其修正。
参考资料
http://www.tuicool.com/articles/6FF7fi
http://ishalou.com/blog/2012/10/16/how-to-create-a-cocoapods-spec-file/
https://guides.cocoapods.org/syntax/podspec.html#specification
网友评论
楼主,这个是什么原因呢?