写这篇文章的目的,是在项目组件化中,pod文件目录下的文件夹多级(A>>B>>C)分组遇到的一些问题和解决思路
podSpec的一些属性
Pod::Spec.new do |s|
# 项目名
s.name = 'SYBaseKit'
# 版本号
s.version = '0.1.9'
# 简单描述
s.summary = 'SYBaseKit.'
# 详细描述
s.description = <<-DESC
SYBaseKit框架
DESC
# 项目的主页
s.homepage = 'http://git.oschina.net/qq2350199075/SYBaseKit'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 项目遵守的协议
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 作者的邮箱
s.author = { 'jixiedaheng@163.com' => '2350199075@qq.com' }
# git仓库的https地址
s.source = { :git => 'https://git.oschina.net/qq2350199075/SYBaseKit.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 项目的最低版本支持
s.ios.deployment_target = '8.0'
# 表示源文件的路径,这个路径是相对podspec文件而言的。(这属性下面单独讨论)
s.source_files = 'SYBaseKit/Classes/**/*'
#c.source_files = 'SYBaseKit/Classes/**/*'
# s.resource_bundles = {
# 'SYBaseKit' => ['SYBaseKit/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 3.1.0'
end
感兴趣的同学可以去cocopods关于podspec的介绍 看下介绍
我在组件中遇到的问题是 pod完成到本地项目中 只能显示两级文件夹
就拿AFNetWorking举例吧 上图
我查询了其他关于组件化的文章,对于pod后的文件夹只显示两级关系,什么意思,就是AFNetwork>>UIKIt,值显示到这里,而我想要的是AFNetWork>>UIKit>>UIButton,或者AFNetWork>UIKit>UILab这些细分的文件夹
在这期间也查阅了YYkit框架 也是只有两级
不懂这些框架为什么不分的详细一些,也有可能都是在一个分类下吧
我想要的是这种样式 来来 上图
OK 结果都展示完了 下面讲一下思路
关于文件显示 都在podSpec文件里的一个属性控制
source_files是需要编译文件的文件目录,注意是文件目录而不是工程目录
subspec相当于把项目划分成几个子模块,需要那部分功能,就引入对应的组件,比如AFNetworking的podspec 在终端上搜索AFNetWorking 你会发现分成几个小模块,比如你需要检测网络时,就只需要引用AFNetworking/Reachability即可
我自己的私有库是这样的 多了一级文件(A>>B>>C)
下面是关于subspec的一些写法
Pod::Spec.new do |s|
# 项目名
s.name = 'SYBaseKit'
# 版本号
s.version = '0.1.9'
# 简单描述
s.summary = 'SYBaseKit.'
# 详细描述
s.description = <<-DESC
SYBaseKit框架
DESC
# 项目的主页
s.homepage = 'http://git.oschina.net/qq2350199075/SYBaseKit'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 项目遵守的协议
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 作者的邮箱
s.author = { 'jixiedaheng@163.com' => '2350199075@qq.com' }
# git仓库的https地址
s.source = { :git => 'https://git.oschina.net/qq2350199075/SYBaseKit.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 项目的最低版本支持
s.ios.deployment_target = '8.0'
# 表示源文件的路径,这个路径是相对podspec文件而言的。(这属性下面单独讨论)
# s.source_files = 'SYBaseKit/Classes/**/*'
#第三层文件夹
c.subspec 'NSDictionary' do |nsd|
nsd.source_files = 'SYBaseKit/Classes/Category/NSDictionary/**/*'
end
c.subspec 'NSObject' do |nso|
nso.source_files = 'SYBaseKit/Classes/Category/NSObject/**/*'
end
c.subspec 'NSString' do |nss|
nss.source_files = 'SYBaseKit/Classes/Category/NSString/**/*'
end
c.subspec 'UIView' do |uiv|
uiv.source_files = 'SYBaseKit/Classes/Category/UIView/**/*'
end
end
s.subspec 'Tool' do |t|
# t.source_files = 'SYBaseKit/Classes/Tool/**/*'
t.subspec 'Define' do |defi|
defi.source_files = 'SYBaseKit/SYBaseKit/Classes/Tool/Define/**/*'
end
t.subspec 'NetWork' do |net|
net.source_files = 'SYBaseKit/SYBaseKit/Classes/Tool/NetWork/**/*'
end
end
#c.source_files = 'SYBaseKit/Classes/**/*'
# s.resource_bundles = {
# 'SYBaseKit' => ['SYBaseKit/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 3.1.0'
end
下面是重要的
下面是重要的
下面是重要的
在描述subspec时 一定要指定对应的source_files
如果source_files定义错误就会报错误
file patterns: The `source_files` pattern did not match any file.
这个是在指定共享的类库时, 文件路径不对, 也就是设置 s.source_files 字段时, 发生了错误, 这里的路径是相对于SYBaseKit.podspec文件的, 如果是与SYBaseKit.podspec同级的文件夹, 直接写文件夹名称即可
在定义subspec
s.subspec 'Tool' do |t|
t.source_files = 'SYBaseKit/Classes/Tool/**/*'
end
如果Tool文件下还有一个子目录,比如Tool>>NetWork
那么需要这样定义
s.subspec 'Tool' do |t|
# t.source_files = 'SYBaseKit/Classes/Tool/**/*'
#子文件夹的写法(一定要把父文件夹的source_files给注释掉)
t.subspec 'Define' do |defi|
defi.source_files = 'SYBaseKit/SYBaseKit/Classes/Tool/Define/**/*'
end
end
一定要把父文件的source_files注释掉
一定要把父文件的source_files注释掉
一定要把父文件的source_files注释掉
否则是没有效果的,本人亲测。
参考文献如下
Cocopods Guide
使用Cocoapods创建私有podspec
谈谈CocoaPods组件二进制化方案
cocopods进阶