如何将自己的组件库使用CocoaPods管理

2018-09-20  本文已影响0人  昵称经已被占用

使用CocoaPods的好处

安装CocoaPods

1.查看 Ruby 镜像源

gem sources -l

2.移除当前镜像源

gem sources --remove 当前镜像源

3.添加Ruby China 官方 RubyGems 镜像

gem source -a https://gems.ruby-china.com

为了验证是否更换成功,可以再执行一次gem sources -l来查看当前镜像
4.安装CocoaPods

sudo gem install cocoapods

使用CocoaPods管理组件

1.注册trunk
2.podspec

Cocopods原理:根据Podfile描述,找到对应代码库的podspec文件
然后根据podspec中的描述,找到代码库,并且找到之后,拷贝需要的文件到自己的工程中。


像图中的目录结构,该如何编写podspec文件呢

Pod::Spec.new do |s|
 
  #设置组件库的名称
  s.name         = "xxx"  

  #设置组件库的版本号
  s.version      = "5.4.9" 

  #组件库的简介
  s.summary      = "xxxxxx" 

  # 组件库的详情描述,要求比简介的字数多些
  s.description  = <<-DESC
                  xxxxxxxxxxx
                   DESC
  #设置仓库主页
  s.homepage     = "https://www.yuntongxun.com/"

  #设置许可
  s.license      = "MIT"

 #设置作者
  s.author       = { "xxx" => "xxx" }

 #设置支持的最低系统版本
  s.ios.deployment_target = "8.0"

 #设置仓库源,表示在哪可以找到组件工程(支持 git、svn、http 服务器)
  s.source  = { :git => "https://xxxxxxx", :tag => "#{s.version}" }
#s.source = { :svn => 'http://xxxxxxx', :tag =>  "#{s.version}" }
#s.source = { :http => 'http://xxxxxx/xxx.zip' }
  
 #资源文件
  s.resources  = "sdk/CCPSDKBundle.bundle"

 #设置源文件路径,不是整个工程的文件,而是自己封装的需要暴露出来的代码,以后别的工程引入,就会引入这里的代码。
  s.source_files = "sdk/*.h"
 
 #设置使用的静态库(非系统)
  s.vendored_library = 'sdk/*.a'

  #设置依赖库(系统),不需要 lib,例如: libicucore写成icucore即可
  s.libraries    = "resolv.9","icucore","sqlite3","z","xml2","bz2.1.0","c++"

 #设置依赖的 framework(系统),写的时候不需要后缀名
  s.framework    = "CoreTelephony","MediaPlayer","CFNetwork","SystemConfiguration","MobileCoreServices","AudioToolbox","AVFoundation","VideoToolbox"

 #设置使用的framework(非系统)
 # vendored_frameworks = ""

 #设置子目录
  s.subspec 'Delegate' do |ss|
  ss.source_files = "sdk/Delegate/*.h"
  end

  s.subspec 'enums' do |ss|
  ss.source_files = "sdk/enums/*.h"
  end

  s.subspec 'Manager' do |ss|
  ss.source_files = "sdk/Manager/*.h"
  end

  s.subspec 'private' do |ss|
  ss.source_files = "sdk/private/*.h"
  end

  s.subspec 'types' do |ss|
  ss.source_files = "sdk/types/*.h"
  #三级目录
  ss.subspec 'LiveChatRoomType' do |sss|
  sss.source_files = "sdk/types/LiveChatRoomType/*.h"
  end
  end

  s.subspec 'board' do |ss|
  ss.source_files = "sdk/board/*.h"
  end

  #设置组件库是否是基于 ARC 内存管理的,默认为 true,如果不是,会自动添加-fno-objc-arc 
  s.requires_arc = true

  #如果部分是ARC
  #spec.requires_arc = false
  #spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm'] //指定 ARC 的文件

  #设置依赖的其他 pod 库
  # s.dependency "JSONKit", "~> 1.4"

  #设置xcconfig
  s.xcconfig = {
      'OTHER_LINKER_FLAGS' => '-ObjC',
      'ENABLE_BITCODE' => 'NO'
    }
end
  • 文件名匹配
    • *匹配所有文件
    • c*匹配以名字C开头的文件
    • *c匹配以名字c结尾的文件
    • *c*匹配所有名字包含c的文件
    • **文件夹以及递归子文件夹
    • ?任意一个字符(注意是一个字符)
    • [set] 匹配多个字符,支持取反
    • {p,q} 匹配名字包括p 或者 q的文件
3.验证pod 库
4.推送自己的podspec到cocoapods的索引库
5.测试能否索引到
1.  rm ~/Library/Caches/CocoaPods/search_index.json
1.  pod setup
3.  pod search name
6.其他
移除组件库的指令(name 为组件库名称,tag 是想要移除的版本号,如果要移除所有版本,不带 tag 就行):
1.  pod trunk delete name tag
2.  rm ~/Library/Caches/CocoaPods/search_index.json
3.  pod setup
4.  pod search name
7.可能遇到的问题

解决pod lib lint/repo push不支持i386编译&只能真机运行的库

 # command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator)
 # command += Fourflusher::SimControl.new.destination(:oldest, 'iOS', deployment_target)
  command += %w(--help) #为了绕过模拟器检测不通过的 bug

基于本地pod库的组件化

上面讲到的方法是将组件库托管到公有远程仓库,任何人都可以下载集成组件库。但是有时候我们公司内部的一些大型项目也使用了组件化的方式来开发,这时候我们的组件库就不需要专门放到远程仓库来托管,照样也可以使用CocoaPods来管理。

MainTarget ComponentA
Pod::Spec.new do |spec|
  spec.name         = "ComponentA"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of ComponentA."
  spec.homepage     = "https://www.yuntongxun.com/"
  spec.license      = "MIT"
  spec.author       = { "xxx" => "xxx@yuntongxun.com" }
  spec.source       = { :path => 'ComponentA.podspec' }
  spec.source_files  = "ComponentA/Class/*.{h,m}"
end

这里主要是spec.source组件路径要指向自身,其他的配置根据实际需要可以添加

target 'MainTarget' do
    pod 'ComponentA' , :path => '../ComponentA'
end
上一篇 下一篇

猜你喜欢

热点阅读