组件库(私有库)维护---文件分层和文件夹一起有层次上传

上一篇:组件库(私有库)维护---添加依赖库

在我们引用的第三方工具中,其实会发现有些三方的文件是有文件夹的,比如:AFNetworking,

组件库(私有库)维护---文件分层和文件夹一起有层次上传_第1张图片

还有许多的三方依赖在项目中是文件夹呈散列状态的,比如:SDWebImage,SVProgressHUD

组件库(私有库)维护---文件分层和文件夹一起有层次上传_第2张图片

基于我们的组件库开发,一定会遇到不同的库文件(比如基础定义文件、类别、基础view、基础model、小工具类等),为了看起来不太乱,会划分成不同个文件夹,来让同事开发的时候也能够便于查找使用。

 

这里我就带大家看看怎么让你的私有库看起来层次分明,易于打理。

一、文件显示层级

cocoaPods创建私有库的时候,如果私有库中的文件很多,想做到和项目中的文件夹分层,就需要在podSpec文件里面用到s.subspec 'xxx' do |ss|语句来配置。

先看一个文件层级

组件库(私有库)维护---文件分层和文件夹一起有层次上传_第3张图片

文件层级

如图所示,现在我们要把 FSRes-iOS-Code这个文件夹搭建私有库。

我们一般在用pod lib create FSRes-iOS-Code创建完项目后,会生成相应的目录,只要把需要做成私有库的文件夹代码文件放到 classes里面就可以了。

首先先不考虑文件分层的写法,这样podspec文件里面是这样的

组件库(私有库)维护---文件分层和文件夹一起有层次上传_第4张图片

在图中可以看出,就是普通的写法,按照图中这么写的话,会导致私有库搭建完成并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、ConfigTools文件夹,要实现搭建的私有库显示这样的文件夹层级,就需要分别将这个五个文件夹全部写错 subspec的形式。

  • Config文件夹
# 初始配置资源文件夹
  s.subspec 'Config' do |ss1|
      # 下载Base下所有的.h和.m文件
      ss1.source_files = 'FSRes-iOS-Code/Classes/Config/*.{h,m}'
  end
  • Category 文件夹 
# 第二层文件夹名称Extensions(虚拟路径)
  s.subspec 'Category' do |ss2|
      # 下所有的.h和.m文件
      ss2.source_files = 'FSRes-iOS-Code/Classes/Category/*.{h,m}'
  end
  • Base 文件夹 Base文件夹中的文件会引用到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
  • Tools 文件夹 Tools下的文件会引用到三方文件SVProgressHUD、Reachability,所以写在Tools的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的文件夹,这个文件夹就是用来放资源文件的,如图:

组件库(私有库)维护---文件分层和文件夹一起有层次上传_第5张图片

 

将资源文件放到这个里面的时候,接下来要去设置FSRes-iOS-Code.podspec文件,主要就是将原先下面这段注释的代码接触注释就好了:

 s.resource_bundles = {
    'FSRes-iOS-Code' => ['FSRes-iOS-Code/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'

这样写的话,文件格式展示出来的就是:

 

组件库(私有库)维护---文件分层和文件夹一起有层次上传_第6张图片

这种方式添加的资源文件,使用起来就简单了,直接就可以用:

UIImage *image = [UIImage imageNamed:@"back"];

资源文件如果不多的话,使用第二种比较方便,如果资源文件多的话,就需要使用bundle来管理了。

你可能感兴趣的:(ios开发,组件库)