第一次做私有Pod, 也是翻遍了网上的教程来学习.
经过自己的实践, 写一篇相对详细的文章吧
文章可能有点乱, 但是文中提到的东西, 基本我都放到文章开头了. 如果还有哪里不明白, 可以评论留言.
先说一个小知识, 后面看到可以来查看
文件匹配准备工作
匹配所有文件
c匹配以名字C开头的文件
*c匹配以名字c结尾的文件
c匹配所有名字包含c的文件
**文件夹以及递归子文件夹
?任意一个字符(注意是一个字符)
[set] 匹配多个字符,支持取反
{p,q} 匹配名字包括p 或者 q的文件
- 请去安装CocoaPods, 具体过程百度吧....这个不说了
最简单的 brew 一下
- 去代码托管平台创建两个仓库
例如:
私有库A, 名字叫YYYPodSpecs, 地址https://github.com/YYY/YYYPodSpecs.git
私有库B, 名字叫YYYPrivatePod, 地址https://github.com/YYY/YYYPrivatePod.git这里简单说一下两个库的作用
库A, 用于存放
.podspec
文件的. 这个文件大概相当于pod的索引吧.具体是什么, 请google一下.库B, 用于存放私有库代码的. 这个没有什么值得说的
继续准备工作
终端, 切换到.cocoapods/repos 文件夹下
cd ~/.cocoapods/repos
继续执行 pod repo add 文件夹名称 私有库A的地址, 如
pod repo add YYYPodSpecs https://github.com/YYY/YYYPodSpecs.git
下面, 注意了, 换路径了, 换路径了, 换路径了
换一个其他的路径, 比如我们在Document里面创建我们的私有库项目
cd ~/Document
pod lib create YYYPrivatePod
然后巴拉巴拉一堆选择题, 您看着答.
好了, YYYPrivatePod项目已经有了, 文件结构如下
文章图片
项目结构1.png 把我们的文件都放到Classes文件夹下, ReplaceMe.m删掉
如果文件都已经放到Classes文件下, 我们要测试一下正确性等相关事情, 只需要cd 到
Example
目录下, 执行pod update
, 然后打开.xcworkspace
即可.
这里我遇到坑了
坑1
当我们pod update之后, 我们看到的文件结构, 不一定跟我们制作完后别人pod install 下来的结构一样. 也就是说, 如果没有特殊处理, 都是没有层级的(都在同级)
坑2好了, 下面可以编码了.
如果想pod install后的文件结构有层级,不同文件夹下的文件, 不要引用(个人感觉这地方绝对不能引用, 但没有仔细研究. 深入学习的自行百度一下吧)
例如: Classes里面有两个文件夹A和B,
A中有一个类, Aa.h, Aa.m
B中有一个类, Bb.h, Bb.m
Bb.h和.m中不要引入Aa.h
编辑.podspec文件
好了,这个比较重要的地方到来了
Pod::Spec.new do |s|
s.name= 'YYYPrivatePod'
s.version= '0.0.6'
s.summary= 'A Method & Function Kit for YYY'
s.description= <<-DESC
TODO: Add long description of the pod here.
DESCs.homepage= 'https://github.com/YYY/'
# s.screenshots= 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license= { :type => 'MIT', :file => 'LICENSE' }
s.author= { 'yyy' => 'yyy@xxx.com' }
s.source= { :git => 'https://github.com/YYY/YYYPrivatePod.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/'s.ios.deployment_target = '8.0's.source_files = 'YYYPrivatePod/Classes/*.{h}'
s.public_header_files = 'YYYPrivatePod/Classes/*.{h}'
s.requires_arc = true
s.frameworks = 'UIKit', 'Foundation'# s.resource_bundles = {
#'TKKit' => ['YYYPrivatePod/Assets/*.png', 'Classes/**/*.{nib, storyboard}']
# }# s.dependency 'AFNetworking', '~> 2.3's.subspec 'YYY_CALayer' do |ss|
ss.source_files = 'YYYPrivatePod/Classes/YYY_CALayer/*'
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_CALayer/*.h'
ends.subspec 'YYY_Config' do |ss|
ss.source_files = 'YYYPrivatePod/Classes/YYY_Config/*'
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_Config/*.h'
ends.subspec 'YYY_Foundation' do |ss|
ss.source_files = 'YYYPrivatePod/Classes/YYY_Foundation/*'
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_Foundation/*.h'
ends.subspec 'YYY_UIKit' do |ss|
ss.source_files = 'YYYPrivatePod/Classes/YYY_UIKit/*'
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_UIKit/*.h'
endend
这是我的.podspec文件. 下面对几个比较重要的字段去说明一下
s.version
这个不要随便写, 因为这个字段的值要和我们提交私有库代码的时候打的tag一致.
s.source
这个字段就写YYYPrivatePod仓库的地址就好了 (https://github.com/YYY/YYYPrivatePod.git)
s.source_files
这个字段就有点难受了.我的私有库结构如下图
文章图片
文件结构2.png
因为我的Classes文件夹下, 只有一个TKKit.h这一个文件, 其他都是文件夹.我要参与编译的只有这一个文件, 所以就不需要用**
去遍历子文件夹了, 并且直接将文件后缀定死为.h.
此处默认样式YYYPrivatePod/Classes/**/*
(**
和*
代表的什么, 请在文章开头处查看). 如果Classes/**的话, 那么后面设置的文件结构都将没用了, 没有层级.
s.subspec 'YYY_CALayer' do |ss|好了, 比较难过的地方基本就完成了
ss.source_files = 'YYYPrivatePod/Classes/YYY_CALayer/* '
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_CALayer/*.h'
end
重点来了, 我们要的分级结构, 就是由这些东西来设置的.而不是我们在项目中自己创建文件夹去分级. 写法照猫画虎吧. 如果pod install 后发现没有层级, 仔细查看这个地方和s.source_files字段
全部修改好之后, 我们可以在私有库项目(YYYPrivatePod)目录中, 终端执行
pod lib lint --allow-warnings --verbose
如果.podspec文件验证通过, 那就是一行绿字. 验证失败就是几个error, 可以根据日志去看一下.
当.podspec验证成功之后, 我们的私有库的整体工作基本就是完成了, 下面就是提交代码, 打tag, 将.podspec上传到YYYPodSpecs库中
git remote add origin https://github.com/YYY/YYYPrivatePod.git
git add .
git commit -m "message"
git push origin master
-
git tag -m 'v0.0.0' 0.0.0
(注意引号外的文字与s.version字段相同) git push --tags
pod repo push YYYPodSpecs YYYPrivatePod.podspec --allow-warnings
此时还会重新校验.podspec文件. 如果没有报错, 那么新建一个项目, 在 podfile中的顶部加上
source 'https://github.com/YYY/YYYPodSpecs.git'
(管理.podspec的git地址, 此处可以是ssh)【iOS私有Pod|iOS私有Pod, 指南+踩坑】下面正常 pod 就好了