iOSiOS点点滴滴iOS Developer

Cocopods组件化之podspec文件解析

2017-07-17  本文已影响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进阶

上一篇下一篇

猜你喜欢

热点阅读