上一篇:组件库(私有库)维护---添加依赖库
在我们引用的第三方工具中,其实会发现有些三方的文件是有文件夹的,比如:AFNetworking,
还有许多的三方依赖在项目中是文件夹呈散列状态的,比如:SDWebImage,SVProgressHUD
基于我们的组件库开发,一定会遇到不同的库文件(比如基础定义文件、类别、基础view、基础model、小工具类等),为了看起来不太乱,会划分成不同个文件夹,来让同事开发的时候也能够便于查找使用。
这里我就带大家看看怎么让你的私有库看起来层次分明,易于打理。
cocoaPods创建私有库的时候,如果私有库中的文件很多,想做到和项目中的文件夹分层,就需要在podSpec
文件里面用到s.subspec 'xxx' do |ss|
语句来配置。
先看一个文件层级
文件层级
如图所示,现在我们要把 FSRes-iOS-Code
这个文件夹搭建私有库。
我们一般在用pod lib create FSRes-iOS-Code
创建完项目后,会生成相应的目录,只要把需要做成私有库的文件夹代码文件放到 classes
里面就可以了。
首先先不考虑文件分层的写法,这样podspec
文件里面是这样的
在图中可以看出,就是普通的写法,按照图中这么写的话,会导致私有库搭建完成并pod导入后,所有的.h .m .xib .png等文件都在一个文件夹里面,并没有我们本地那样的文件夹Base、Category等文件夹了。
这样的pod私有库虽然在正常的使用中并没有任何问题,但是看起来很乱,这个时候我们就需要进行文件分层了。例如:把UIView类
都放在View
里面,把Model类
都放在Model
里面。这里我们基于没有文件分层的基础上进行修改,需要使用到下面的语句
s.subspec 'View' do |ss|
ss.source_files = ''
end
下面我们参照图一给出的文件层级写相关的 subspec
在classes
文件夹下面,还有一个总领的头部文件:FBPrivate.h,那么就将上面图片中的标记中的代码替换为:
# 引入所有文件 **/*是一个正则,表示下面的所有文件
s.source_files = 'FSRes-iOS-Code/Classes/FBPrivate.h'
s.public_header_files = 'FSRes-iOS-Code/Classes/FBPrivate.h'
如果外面没有文件,Classes文件夹下面只有文件夹的时候,这个时候,podspec
文件里面的source_files
就可以不用写了。
首先 Classes
下面有Base、Category、Config
、Tools
文件夹,要实现搭建的私有库显示这样的文件夹层级,就需要分别将这个五个文件夹全部写错 subspec
的形式。
Config
文件夹# 初始配置资源文件夹
s.subspec 'Config' do |ss1|
# 下载Base下所有的.h和.m文件
ss1.source_files = 'FSRes-iOS-Code/Classes/Config/*.{h,m}'
end
# 第二层文件夹名称Extensions(虚拟路径)
s.subspec 'Category' do |ss2|
# 下所有的.h和.m文件
ss2.source_files = 'FSRes-iOS-Code/Classes/Category/*.{h,m}'
end
Config
和Category里面文件的头文件,所以要写在它们的subspec
下面并添加依赖s.subspec 'Base' do |ss1|
# 下载Base下所有的.h和.m文件
ss1.source_files = 'FSRes-iOS-Code/Classes/Base/*.{h,m}'
ss1.dependency 'FSRes-iOS-Code/Config'
ss1.dependency 'FSRes-iOS-Code/Category'
end
subspec
下面并添加依赖s.subspec 'Tools' do |ss3|
# 下载Extensions下所有的.h和.m文件
ss3.source_files = 'FSRes-iOS-Code/Classes/Tools/**/*'
ss3.dependency 'SVProgressHUD'
ss3.dependency 'Reachability'
end
这里需要注意的几个问题:
一个就是如果有A subspec
需要使用到其他的B subspec
,就需要在A subspec
下面添加对B subspec
的依赖,这个依赖是针对subspec
的,不需要写本地文件路径。
依赖其他第三方公开pod库的话,可以写在使用到的subspec
里面,也可以写在总的依赖里。
如果A subspec
里面有使用到B subspec
下的文件,B subspec
又引用到A subspec
下的文件,这样的话,分层实现起来比较困难,解决的思路可以在classes
下面创建一个.h的头文件,引用各个头文件,并设置 s.souce_files = 'FSRes-iOS-Code/Classes/Login.h'
pods私有库有时候会用到图片资源或者其他资源,这些资源应该怎么配置和获取使用呢?
在我们使用pod lib creat FSRes-iOS-Code
的时候,会在Classes
同级目录下面生成一个Assets
的文件夹,这个文件夹就是用来放资源文件的,如图:
将资源文件放到这个里面的时候,接下来要去设置FSRes-iOS-Code.podspec
文件,主要就是将原先下面这段注释的代码接触注释就好了:
s.resource_bundles = {
'FSRes-iOS-Code' => ['FSRes-iOS-Code/Assets/*.png']
}
接下来怎么使用呢?
因为s.resource_bundles
生成的资源文件,会生成一个bundle文件,使用的时候就是要先获取到这个bundle,然后获取到里面的资源。
calssType
是指当前使用图片的控件所在的类+ (instancetype)mineBundle:(id)classType{
static NSBundle *mine = nil;
if (mine == nil) {
classType = [classType isKindOfClass:NSString.class] ? NSClassFromString(classType) : classType;
NSString * path = [[NSBundle bundleForClass:classType] pathForResource:@"Mine" ofType:@"bundle"];
mine = [NSBundle bundleWithPath:path];
}
return mine;
}
target
是指使用图片的控件所在的类+(UIImage *)configImg:(id)target imageName:(NSString *)imageName{
UIImage *img = nil;
if (img == nil) {
img = [UIImage imageNamed:imageName inBundle:[self mineBundle:target] compatibleWithTraitCollection:nil];
}
return img;
}
还有一种资源文件上传的方式就是设置resources
,如下图:
# 设置资源文件路径
s.resources = 'HGGridView/Classes/resource/*.png'
这样写的话,文件格式展示出来的就是:
这种方式添加的资源文件,使用起来就简单了,直接就可以用:
UIImage *image = [UIImage imageNamed:@"back"];
资源文件如果不多的话,使用第二种比较方便,如果资源文件多的话,就需要使用bundle来管理了。