美文网首页iOSiOS点点滴滴iOS Developer
Cocopods组件化之podspec文件解析

Cocopods组件化之podspec文件解析

作者: 骨古 | 来源:发表于2017-07-17 20:16 被阅读485次

    写这篇文章的目的,是在项目组件化中,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举例吧 上图

    Snip20170717_5.png

    我查询了其他关于组件化的文章,对于pod后的文件夹只显示两级关系,什么意思,就是AFNetwork>>UIKIt,值显示到这里,而我想要的是AFNetWork>>UIKit>>UIButton,或者AFNetWork>UIKit>UILab这些细分的文件夹
    在这期间也查阅了YYkit框架 也是只有两级

    Snip20170717_6.png

    不懂这些框架为什么不分的详细一些,也有可能都是在一个分类下吧
    我想要的是这种样式 来来 上图

    Snip20170717_9.png

    OK 结果都展示完了 下面讲一下思路
    关于文件显示 都在podSpec文件里的一个属性控制
    source_files是需要编译文件的文件目录,注意是文件目录而不是工程目录
    subspec相当于把项目划分成几个子模块,需要那部分功能,就引入对应的组件,比如AFNetworking的podspec 在终端上搜索AFNetWorking 你会发现分成几个小模块,比如你需要检测网络时,就只需要引用AFNetworking/Reachability即可

    Snip20170717_10.png

    我自己的私有库是这样的 多了一级文件(A>>B>>C)

    Snip20170717_11.png

    下面是关于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同级的文件夹, 直接写文件夹名称即可

    Snip20170717_13.png

    在定义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进阶

    相关文章

      网友评论

      • 呵呵哈哈嘿嘿:你好,组件依赖多个三方库,spec文件内的dependency该怎么写?
        小千:@呵呵哈哈嘿嘿 我也是私有库的引用啊,你是不是在Podfile 头部没有配置多私有库的source?!
        呵呵哈哈嘿嘿:@小千 我引用的是自己写的库,且自己的库在SVN上放着,改怎么写,直接写会报一个
        Unable to find a specification for `xxxx` depended upon by `xxxxx`的错
        小千:多写几个dependency啊,如
        s.dependency 'xxx', '~> 1.0.0'
        s.dependency 'yyy', '~> 1.0.0'
      • 呵呵哈哈嘿嘿:subspec 之间如何设置依赖?
        呵呵哈哈嘿嘿:@骨古 多谢:smiley:
        骨古:@呵呵哈哈嘿嘿 直接依赖就可以了 这是我的一个私有库依赖另一个私有库 实例代码
        c.subspec 'NSObject' do |nso|
        nso.source_files = 'SYBaseKit/Classes/Category/NSObject/**/*'
        nso.dependency 'SYBaseKit/Category/NSString'
        end
      • d9557f883fd8:能把你的podspec发我一份看看么。。。我这一直报文件找不到。。然后看到找不到的路径是
        s.name/s.subspec 实在找不到是为啥会有这个路径
        d9557f883fd8:@骨古 我仔细看了你的podspec和我的写法是一样的。。。我现在报的文件找不到是s.name/subspec/subspec 这个路径。。但是我看你的文件里也是s.name/subspec/subspec的路径下肯定是没文件吧。。因为你还有一个classes文件夹的。。。。不知道是我工程的问题还是啥
        骨古:@zhnnnnn 已发 你可以把你的podspec文件 放出来 应该是路径的问题
        d9557f883fd8:如果可以的话发我邮箱里475816908@qq.com

      本文标题:Cocopods组件化之podspec文件解析

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