Cocoapods使用小记

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

一、概述

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #安装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
  • 下载和卸载命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #下载最新版本
    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的版本。

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

二、Podfile基础使用

1、基础
  • 创建Podfile文件

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

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

  • Podfile添加第三方库依赖

    1
    2
    3
    4
    5
    6
    7
    8
    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
  • 下载和安装第三方库

    1
    pod install

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

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

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

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

    1
    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分支(默认)

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

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

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

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

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

    1
    2
    3
    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

    1
    2
    3
    4
    #将远程的私有版本仓库添加到本地
    pod repo add qs_private_pods_specs https://github.com/buaa0300/qs_private_pods_specs.git

    #添加成功后,打开~/.cocoapods/repos可以看到新增的qs_private_pods_specs
2、创建私有Pod库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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编辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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中去, 在终端执行:
1
pod repo push qs_private_pods_specs QSBizSDK.podspec

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

5、更多参考

四、Cocoapods重要的”新”特性

1、cocoapods1.4.0支持static framework(静态框架)
  • 1.4.0之前,只能通过use_framework!只能发布动态framework,新增的特性解决了过去动态framework不能依赖静态库的弊端,现在的静态framework可以依赖静态库,也可以依赖通过vendored_frameworks发布的第三方框架.(vendored_frameworks和vendored_library是在podspec文件内使用的属性,用法是声明包含的第三方framework和library.

  • static framework和library区别:framework是对于library、头文件和资源等内容的封装;library可以是动态或者静态的,静态库在构建时期链接,但是动态库是在运行时才进行加载。

  • 动态库不能依赖静态库(library)是因为静态库(library)不需要在运行时再次加载,如果多个动态库依赖同一个静态库,会出现多个静态库的拷贝,而这些拷贝本身只是对于内存空间的消耗

  • 在1.4.0之前,资源只能通过动态库的方式构建,所以不能依赖vendored_framework的库.而且对于vendored_framework的二进制库,无法在转换成资源pod时仍保持动态性

  • 使用静态框架的支持,用法简单,只需要在podspec文件内,声明如下即可

    1
    s.static_framework = true
  • 更多参考:cocoapods的静态库和动态库CocoaPods 动/静态库混用封装组件化

2、CocoaPods 1.7 支持generate_multiple_pod_projects
  • 引入了一个 generate_multiple_pod_projects 的选项,可以让每个依赖都作为一个单独的项目引入,大大增加了解析速度
  • 开启的方式很简单,只要在 Podfile 里加入这一行就可以了:
1
install! 'cocoapods', generate_multiple_pod_projects: true
3、CocoaPods 1.8 Beta 将CDN设置为默认值
  • 我们在安装pod时候,会执行pod setup,其本质是https://github.com/CocoaPods/Specs 上的项目克隆到/Users/用户名/.cocoapods/repos目录下,若此目录下已经有这个项目,使用pod setup命令则会将项目更新到最新的状态。

  • CDN支持最初是在1.7版本中引入的,最终在1.7.2中完成。 它旨在大大加快初始设置和依赖性分析。 使用1.8CocoaPods不再需要克隆现在巨大的主规格repo才能运行,用户几乎可以立即将他们的项目与CocoaPods集成。

  • 在1.8 Beta之前,需要拷贝现在庞大的 master specs repo 才能运行,但是之后,可以使用如下方式省略master specs repo的clone.

    • 编辑Podfile以将CDN设置为主要来源:
    1
    2
    - source 'https://github.com/CocoaPods/Specs.git'
    + source 'https://cdn.cocoapods.org/'
  • 运行以下命令将其从托管存储库列表中删除:

    1
    pod repo remove master

注意:如果您希望继续使用基于git的源,则必须确保通过源DSLPodfile中明确指定它,否则CocoaPods将自动使用CDN进行依赖性解析。

4、更多

CocoaPods 1.9 新特性

五、其他

1、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文件
2、第三方库禁止BITCODE
1
2
3
4
5
6
7
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
3、清除相关命令
1
2
3
4
5
6
7
8
9
10
11
#查看本地pod缓存
pod cache list

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

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

#删除缓存方法
rm ~/Library/Caches/Cocoapods/Pods/Pods/Release
4、其他
1
2
3
4
5
6
7
8
# 查看当前仓库的信息
pod repo

# 更新库命令
pod repo update

# 删除 search_index.json 文件
rm ~/Library/Caches/CocoaPods/search_index.json
文章作者: 南华coder
文章链接: http://buaa0300/nanhuacoder.com/2019/04/24/iOS-Cocoapods01/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 南华coder的空间