注意事项:本文针对的是已经对pods私有库的流程有所了解或想了解这块内容的人群
有想了解pods私有库搭建相关的,可以点击下面链接
pods私有库搭建
一、文件显示层级
cocoaPods创建私有库的时候,如果私有库中的文件很多,想做到和项目中的文件夹分层,就需要在podSpec
文件里面用到s.subspec 'xxx' do |ss|
语句来配置。
先看一个文件层级
如图所示,现在我们要把 Login
这个文件夹搭建私有库。
我们一般在用pod lib create Login
创建完项目后,会生成相应的目录,只要把需要做成私有库的文件夹代码文件放到 classes
里面就可以了。
首先先不考虑文件分层的写法,这样podspec
文件里面是这样的
在图中可以看出,就是普通的写法,按照图中这么写的话,会导致私有库搭建完成并pod导入后,所有的.h .m .xib .png等文件都在一个文件夹里面,并没有我们本地那样的文件夹Api、View等文件夹了。
这样的pod私有库虽然在正常的使用中并没有任何问题,但是看起来很乱,这个时候我们就需要进行文件分层了。把UIView类
都放在View
里面,把Model类
都放在Model
里面。这里我们基于没有文件分层的基础上进行修改,需要使用到下面的语句
s.subspec 'View' do |ss|
ss.source_files = ''
end
下面我们参照图一给出的文件层级写相关的 subspec
在classes
文件夹下面,只有文件夹,并没有其他的.h .m等文件,这个时候,podspec
文件里面的source_files
就可以不用写了。
首先 classes
下面有Api
、Targets
、View
、ViewController
、ViewModel
文件夹,要实现搭建的私有库显示这样的文件夹层级,就需要分别将这个五个文件夹全部写错 subspec
的形式。
- Api文件夹
s.subspec 'Api' do |ss|
ss.source_files = 'Login/Classes/Api/*.{h,m}'
end
- ViewModel 文件夹
ViewModel
里面的.m
文件会引用到Api
里面文件的头文件,所以要写在Api
下面,并且要添加依赖
s.subspec 'ViewModel' do |ss|
ss.source_files = 'Login/Classes/ViewModel/*.{h,m}'
ss.dependency 'Login/Api'
end
- View文件夹
View
文件夹中的文件会引用到Api
和ViewModel
里面文件的头文件,所以要写在它们的subspec
下面并添加依赖
s.subspec 'View' do |ss|
ss.source_files = 'Login/Classes/View/*.{h,m}'
ss.dependency 'Login/Api'
ss.dependency 'Login/ViewModel'
end
- ViewController文件夹
ViewController
下的文件会引用到View
里面文件的头文件,所以写在View
的subspec
下面并添加依赖
s.subspec 'ViewController' do |ss|
ss.source_files = 'Login/Classes/ViewController/*.{h,m}'
ss.dependency 'Login/View'
end
- Targets文件夹
Targets
下的文件会引用到ViewController
里面文件的头文件,所以写在ViewController
的subspec
下面并添加依赖
s.subspec 'Targets' do |ss|
ss.source_files = 'Login/Classes/Targets/*.{h,m}'
ss.dependency 'Login/ViewController'
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 = 'Login/Classes/Login.h'
二、资源文件使用
pods私有库有时候会用到图片资源或者其他资源,这些资源应该怎么配置和获取使用呢?
在我们使用pod lib creat Login
的时候,会在Classes
同级目录下面生成一个Assets
的文件夹,这个文件夹就是用来放资源文件的,如图:
将资源文件放到这个里面的时候,接下来要去设置Login.podspec
文件,主要就是将原先下面这段注释的代码接触注释就好了:
s.resource_bundles = {
'Login' => ['Login/Assets/*.png']
}
接下来怎么使用呢?
因为s.resource_bundles
生成的资源文件,会生成一个bundle文件,使用的时候就是要先获取到这个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来管理了。