美文网首页CocoaPods
cocoapods私有库文件分层和资源文件上传

cocoapods私有库文件分层和资源文件上传

作者: 莪的世界木有如果 | 来源:发表于2018-11-15 17:30 被阅读227次

    注意事项:本文针对的是已经对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下面有ApiTargetsViewViewControllerViewModel文件夹,要实现搭建的私有库显示这样的文件夹层级,就需要分别将这个五个文件夹全部写错 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文件夹中的文件会引用到ApiViewModel里面文件的头文件,所以要写在它们的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里面文件的头文件,所以写在Viewsubspec下面并添加依赖
    s.subspec 'ViewController' do |ss|
          ss.source_files = 'Login/Classes/ViewController/*.{h,m}'
          ss.dependency 'Login/View'
      end
    
    • Targets文件夹 Targets下的文件会引用到ViewController里面文件的头文件,所以写在ViewControllersubspec下面并添加依赖
    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'
    

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


    image.png

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

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

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

    相关文章

      网友评论

        本文标题:cocoapods私有库文件分层和资源文件上传

        本文链接:https://www.haomeiwen.com/subject/wkpxxqtx.html