Cocoapods使用小记

7,381 阅读7分钟

不识庐山真面目,只缘身在此山中

原文链接

一、概述

1、CocoaPods是什么?
  • CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本。

  • iOS程序依赖管理工具还有Carthage(Carthage 是由 Swift 语言写的,只支持动态框架,只支持 iOS8+),工程中可以Carthage和CocoaPods一起存在使用,但是建议使用一种,个人推荐CocoaPods。

  • CocoaPods项目源码

2、下载和安装CocoaPods
  • CocoaPods需要Ruby环境,安装Ruby和修改ruby镜像命令如下:(Mac自带 Ruby

    #安装ruby 
    gem install ruby 
    
    #升级ruby 
    sudo gem update --system
    
    #检查版本
    ruby -v
    
    # 更新ruby镜像
    gem sources --remove https://rubygems.org/
    gem sources -a https://ruby.taobao.org/
    #检查镜像是否更新成功
    gem sources -l
    
  • 下载和卸载命令

    #下载最新版本
    sudo gem install cocoapods (sudo gem install -n /usr/local/bin cocoapods)
    
    #下载指定版本
    sudo gem install cocoapods -v 1.6.1
    
    #卸载
    sudo gem uninstall cocoapods 
    
    #卸载指定版本
    sudo gem uninstall cocoapods -v 1.6.1
    
    #检查pod版本
    pod --version
    
  • 还可以在工程目录下,使用Gemfile来指定使用cocoapods的版本。

    gem "cocoapods", '~> 1.6.1'
    
3、CocoaPods应用
  • 为项目引入优秀的第三方库,如SDWebImage、AFNetworking、YYCache
  • 创建私有pods,将项目中子模块拆分、沉库(内部使用)
  • 创建公有pods,将好的功能模块分享出去

二、Podfile基础使用

1、基础
  • 创建Podfile文件

    #进入项目根路径中执行,生成Podfile文件(如果有Podfile文件不用执行pod init)
    pod init
    

    说明:Podfile文件详细描述了一个或多个工程中targets的依赖关系

  • Podfile添加第三方库依赖

    target 'QSAppDemo' do
      pod 'AFNetworking'
      pod 'YYModel', '~> 1.0.4'
    	pod 'OOMDetector', '1.3'
      # Debug模式下生效
      pod 'FLEX', '~> 2.0', :configurations => ['Debug']
      pod 'WebViewJavascriptBridge', :git => 'https://github.com/marcuswestin/WebViewJavascriptBridge.git'
    end
    
  • 下载和安装第三方库

    pod install
    

    说明1:下载成功后,使用CocoaPods 生成的 .xcworkspace 文件来打开工程;每次更改了 Podfile 文件,要重新执行一次pod update命令;

    说明2:发生执行pod installpod update都卡在Analyzing dependencies的情况,是因为要升级CocoaPods的spec仓库,命令后添加--verbose --no-repo-update 参数可以省略此步。

2、pod指定依赖项版本范围
  • 如果依赖项后不指定版本,默认取最新版本

    pod 'OOMDetector'
    
  • 如果依赖项后跟上特定版本,就是使用指定版本

    pod 'OOMDetector'
    
  • > 0.1 高于0.1版本(不包含0.1版本)的任意一个版本

  • >= 0.1 高于0.1版本(包含0.1版本)的任意一个版本

  • < 0.1 低于0.1版本(不包含0.1版本)的任意一个

  • <= 0.1低于0.1版本(包含0.1版本)的任意一个

  • ~> 0.1.2 版本 0.1.2的版本到0.2 ,不包括0.2。这个基于你指定的版本号的最后一个部分。这个例子等效于>= 0.1.2并且 <0.2.0,并且始终是你指定范围内的最新版本。

3、pod制定依赖库的分支或节点
  • 引入master分支(默认)

    pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
    
  • 引入指定的分支

    pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'develop'
    
  • 引入某个节点的代码

    pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '2.7.0'
    
  • 引入某个特殊的提交节点

    pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '685e31a31bb1ebce3fdb5a752e392dfd8263e169'
    
4、关于Podfile中一些配置说明
  • Source:指定pod的来源。如果不指定source,默认是使用CocoaPods官方的source

    # 使用官方默认地址(默认)
    source 'https://github.com/CocoaPods/Specs.git'
    
  • use_frameworks!:使用此命令会在Pods工程下的Frameworks目录下生成依赖库的framework,如果不使用,会在Pods工程下的Products目录下生成.a的静态库。

    target 'QSAppDemo' do
      use_frameworks!
    end
    

关于Pofile的详细语法可以参考: Podfile Syntax ReferencePodfile文件用法详解

三、Cocoapods建立私有Pod库

1、概述
  • 由于业务需要,需要开发某业务SDK,方便公司内业务接入,选择使用创建私有Pod库;

  • 本质上,创建公有Pod库或者私有Pod库原理是一样的,不一样的是:两者的版本索引查询方式不一样, 公有库的podspec由CocoaPods/Specs管理, 而内部私有使用的pod库需要公司内部建立一个仓库来管理podspec。

  • 私有spec repo的构建形式有两种, 一种是私有git服务器上面创建,一种是本机创建;一般是在公司内部搭建的git服务器上面创建私有spec repo

    #将远程的私有版本仓库添加到本地
    pod repo add qs_private_pods_specs https://github.com/buaa0300/qs_private_pods_specs.git
    
    #添加成功后,打开~/.cocoapods/repos可以看到新增的qs_private_pods_specs
    
2、创建私有Pod库
pod lib create QSBizSDK      # QSBizSDK是SDK的名字

What platform do you want to use?? [ iOS / macOS ]
 > iOS

What language do you want to use?? [ Swift / ObjC ]
 > ObjC

Would you like to include a demo application with your library? [ Yes / No ]
 > YES

Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None

Would you like to do view based testing? [ Yes / No ]
 > No

What is your class prefix?
 > QS

......

说明1pod lib create QSBizSDK其实是下载了一个pod模板,然后在内部通过更改.podspec文件的配置定制化自己的pod,podspec是描述pod的说明信息的。 说明2pod lib create ProjectName其实使用了默认参数,补全的话pod lib create ProjectName --template-url=https://github.com/CocoaPods/pod-template.git

说明3: 将项目托管到Git,私有库一般上传到内部的仓库中。

3、podspec编辑
Pod::Spec.new do |s|
  s.name             = 'QSBizSDK'
  s.version          = '1.0.0'
  s.summary          = 'A short description of QSBizSDK.'
  s.description      = <<-DESC
Add long description of the pod here.
DESC
  s.homepage         = 'https://github.com/buaa0300/QSBizSDK'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = {'南华coder' => 'buaa0300@qq.com'}
  s.source           = { :git => 'https://github.com/buaa0300/QSBizSDK.git', :tag => s.version.to_s }
  
  s.ios.deployment_target = '8.0'
  s.default_subspec = 'QSCore'

  # 各个子模块的个自的源码路径
  s.subspec 'QSCore' do |qscore|
    qscore.source_files = 'Classes/QSCore/**/*'
  end

  # A a 一定要不一样,是别名,添加好暴露的头文件
  s.subspec 'A' do |a|
    a.source_files = 'Classes/QSCore/A/**/*'
    a.public_header_files='Classes/QSCore/A/*.h'
  end
  
  # 可以添加内部自己模块,或者外部的依赖
  s.subspec 'B' do |b|
    a.source_files = 'Classes/QSCore/B/**/*'
    a.public_header_files='Classes/QSCore/B/*.h'
    b.dependency 'Classes/QSCore/A'
    b.dependency 'AFNetworking', '~> 3.0'   
    b.frameworks = 'SystemConfiguration', 'CFNetwork', 'PassKit'
    b.libraries = 'c++', 'z'
  end

  s.subspec 'C' do |c|
    c.source_files = 'Classes/QSCore/C/**/*'
    c.dependency 'Classes/QSCore/B'
  end
end

说明:对于一个功能比较多的SDK,podspec中需要做的事情比较多,如利用subspec将代码模块化,方便使用时按需导入;不同的模块可能依赖framework、静态库、内部其他模块,也需要处理好;

说明2:可以使用pod spec lint xxx.podspec 来检查podspec的配置有效性

4、podspec加入私有Sepc repo
  • 公有库使用trunk方式将.podspec文件发布到CocoaPods/Specs, 内部的pod组件库则是添加到私有的Spec repo中去, 在终端执行:
pod repo push qs_private_pods_specs QSBizSDK.podspec

说明:添加成功之后qs_private_pods_specs中会包含QSBizSDK库的podspec信息, 可以前往~/.cocoapods/repos下的qs_private_pods_specs文件夹中查看, 同时git服务器中的远端也更新了.

5、更多参考

四、其他

1、pod setup原理
  • 本质就是将 github.com/CocoaPods/S… 上的项目克隆到/Users/用户名/.cocoapods/repos目录下,若此目录下已经有这个项目,使用pod setup命令则会将项目更新到最新的状态。
2、pod instal和pod update的区别
  • 执行pod install时,如果Podfile.lock文件存在, 则下载Podfile.lock文件中指定的版本安装,对于不在Podfile.lock文件中的pod库,pod install命令会搜索这个pod库在Podfile文件中指定的版本来安装;
  • 当你想要更新pod库的版本时才使用pod update;它不管Podfile.lock是否存在, 都会读取Podfile文件的的框架信息去下载安装,下载好之后, 再根据下载好的框架信息, 生成Podfile.lock文件
3、第三方库禁止BITCODE
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
           config.build_setting["ENABLE_BITCODE"] = 'NO'
        end
    end
end
4、清除相关命令
#查看本地pod缓存
pod cache list

#清除某个库缓存
pod cache clean xxxx

# 清除所有pod缓存
pod cache clean -all

#删除缓存方法
rm ~/Library/Caches/Cocoapods/Pods/Pods/Release
5、其他
# 更新库命令
pod repo update

# 删除 search_index.json 文件
rm  ~/Library/Caches/CocoaPods/search_index.json