CocoaPods 自学笔记 -- 基础篇 | 来自缤纷多彩的灰

CocoaPods 自学笔记 -- 基础篇 @ WHlcj | 2024-05-03T15:28:51+08:00 | 4 分钟阅读

告别了只会 pod initpod install 的时期~

CocoaPods 简介

CocoaPods 是用 ruby 语言编写的用来管理 iOS 项目的依赖管理器。

为什么要使用 CocoaPods ?

以前使用第三方库步骤:

  1. 拷贝源码
  2. 手动添加 framework
  3. 设置 BuildPhrase

若有组件升级,需要重新走一遍以上流程。整个流程很繁琐、浪费时间且容易出错!

Use CocoPods:

  • 中心化配置:所有依赖的第三方库都配置到 Podfile 文件下进行依赖和版本控制。便于管理和更新
  • 一键集成:只需运行 pod install 即可把所有依赖安装进项目中
  • 自动处理依赖关系

CocoaPods 原理

pod install 的时候 CocoaPods 会根据填写在 Podfile 中的名字,在拉取的 source 的 podspec 仓库中找到它们对应的 .podspec 文件。.podspec 文件记录了该依赖的 remote url 和安装方式以及依赖关系。通过 .podspec 就可以将依赖下载并安装到本地项目中。

CocoaPods 与 Bundler

除了 CocoaPods 和 Bundler,这里再引入一个 RVM 工具。

RVM 与 Ruby

RVM 是一个管理多个 Ruby 环境的工具,可以提供一个便捷的多版本 Ruby 环境的管理和切换。通过 RVM 我们可以轻松的切换 Ruby 的版本,从而使用不同的 Ruby 环境。

Ruby 和 RubyGem

RubyGems 简称 Gem,是一个用于对 Ruby 组件进行管理及打包的工具。通过 Gem 我们可以管理多个 Ruby 工具集。在日常 gem install xxx 的时候,其实是通过 rubygems.org 网站去查询对应的 Gem Package。
我们日常用到的很多工具都是一个 Gem 工具,例如:Bundler、CocoaPods、Fastlane 等等。

CocoaPods 和 Bundler (Bundle)

Bundler 是一个 Ruby 工具,是一个 Gem。Bundler 是用来管理项目中 Gem 依赖和版本的工具。如果我们用一个 iOS (Android、JavaScript、Python)工程来类比一个 Ruby 工程,Bundler 就相当于工程中的 CocoaPods(Gradle、npm 或者 yarn、pypi)。
Bundler 这个工具中,也有对应的来描述这个工程的依赖关系的文件 – Gemfile 。其中使用 Ruby 的语法来描述工程所需依赖、版本等信息。

实战部分

编写 Podfile

其中的 sourceworkspace 如果你不修改的话,默认不用显性声明,inhibit_all_warnings!是可选配置。

安装依赖

pod install 后,新增 Podfile.lock、Pods/、xxx.xcworkspace

  • Podfile.lock: 第一次pod install后生成的文件,Podfile.lock 中会标注项目当前依赖库的准确版本,其中包括了项目在 Podfile 中直接标注使用的库,以及这些库依赖的其他库。
  • xxx.xcworkspace: 组织了 xxx.xcodeproj 和 Pods.xcodeporj 后续在这个工作区开发
  • Pods/ : 所有 Pod 的目录,每一个 Pod 对应 Pods 的一个 target 这个 target 最终会被打包为一个静态库 .a 。工程还有一个 Pods-xxx 的 target 最终打包为一个总的 Pods-xxx.a 被项目所依赖。

Pods/ 内容

  • 各个 Pod 包括:
    • 源码
    • .xcconfig:编译说明书
    • .pch:预编译处理文件
    • .dummy.m:类的空实现
  • Pods-xxx 额外包括:
    • debug/release.xcconfig:对应主 Project –> Info –> Configurations 里的 xcconfig
    • resources.sh:编译或处理 .storyboard、.xcassets 等资源文件
    • framework.sh:用于实现 framework 类型第三方库的链接
  • Headers:头文件的软链接,HEADER_SEARCH_PATHS 的搜索目录
  • Mainfest.lock:Podfile.lock 的拷贝文件
  • Target Support Files:存放 build 时所依赖的一些文件

版本控制

  • Pod/:因为这里面的 Pod 文件本身有 Pod 各自的远程仓库去存放。无需加入版本控制,在 .gitignore 里申明忽略就好。
  • Podfile.lock:可以保证 pod install 后依赖的第三方库版本一致。不会出现 UserA pod install 后,某个依赖升级,导致后面 UserB pod install 工程里某个依赖版本跟 UserA 不一样的情况。

创建自己的私有 Pod

创建步骤

  1. 创建 Pod 工程
1
pod lib create PodName
  1. 编写代码
  2. 编写 .podspec 文件

  1. 提交代码,按照 .podspec 中的 .version 打 tag
  2. 校验 .podspec 文件,包括语法规则和内容完整性等
1
2
3
# 项目中若有依赖静态库,则需要 --uer-libraries
# 在Pod中warnings都会被当成error,所以需要忽略 --allow-warnings
pod lib lint --use-libraries --allow-warnings 
  1. 创建 podsepc 远程仓库
  2. 将 podspec 远程仓库拉取到本地
1
pod repo add RepoName url
  1. 将 .podspec 文件推送到远程仓库
1
2
# 根据情况在项目中加入 --uer-libraries 和 --allow-warnings
pod repo push RepoName xxx.podspec

使用

要在项目中使用创建的私有 Pod,则需要在 Podfile 中添加

1
source 'https://xxxx'    # 或者 @git...