一、Pod
作为包管理工具,CocoaPods 各部分核心功能逐渐演化成相对独立的组件。这些功能独立的组件,均拆分出一个个独立的 Gem 包,而 CocoaPods 则是这些组件的“集大成者”。对于正常发布的 gem 包,可以直接通过 gem install GEM_NAME 安装。
通过查看 Gemfile 可以看出 Pod 对于组件的拆分粒度是比较细微的,通过对各种组件的组合达到现在的完整版本。
安装 Cocoapods:
sudo gem install cocoapods --user-install
// 安装指定版本的 Cocoapods
sudo gem install -n /usr/local/bin cocoapods -v 1.5.3
// 使用指定版本的 Cocoapods 执行命令
pod _1.5.3_ install
// 查询已安装的 Cocoapods
gem list --local | grep cocoapods
去除 "--user-install" :报错 ERROR: While executing gem ... (Gem::FilePermissionError)
去除 sudo:报错 ERROR: While executing gem ... (Errno::EACCES)
Cocoapods 可以把工程分块,分成不同的包,分成不同部分,实现包管理。
通过 Pod 引入远程仓库,只会引入相关文件,不会引入仓库的目录架构。即会把各个目录下的所有文件都抽离出来,放在一起。而引入本地仓库,则会引入仓库的目录架构。
pod 'Alamofire', '0.9'
pod 'Alamofire', :modular_headers => true
pod 'Alamofire', :configurations => ['Debug', 'Beta']
pod 'Alamofire', :source => 'https://github.com/CocoaPods/Specs.git'
pod 'Alamofire', :subspecs => ['Attribute', 'QuerySet']
pod 'Alamofire', :testspecs => ['UnitTests', 'SomeOtherTests']
pod 'Alamofire', :path => '~/Documents/AFNetworking'
pod 'Alamofire', :podspec => 'https://example.com/Alamofire.podspec'
pod 'Alamofire', :git => 'https://github.com/looseyi/Alamofire.git', :tag => '0.7.0'
modular_headers:
在Podfile 中添加 use_modular_headers! ,将使得所有的 pod 模块都能通过 @import 方式导入。
在Podfile中对应的 pod 模块后添加 :modular_headers => true,将使得相应的 pod 模块可以通过 @import 导入。
source:
用于指定模块的地址。
subspecs:
用于指定子模块。
podspec:
每个 Pod 库均有一个 xxx.podspec 文件,用于描述库的版本信息。包括名称、版本、描述信息、源代码地址、编译设置等(link)。可以在该文件中指定库的 subspec,这样外部便可以仅引用 subspec,而不必引用整个库,即实现了外部按需使用当前仓库的功能。
path:
用于指定本地模块的目录。
查看 pod 版本号:
pod --version
pod update 与 pod install:
pod update PODNAME,可以只更新某个特定的pod库(检查是否存在新版本并更新相应的pod库)。
pod install不会去更新已安装的pod库。
当向Podfile中添加了pod,应该使用pod install而不是pod update,在不更新已安装的pod库的版本的基础上安装新添加的pod库。
当想更新某个特定pod库(或所有的库)的版本时,需要使用pod update。
官方文档: link
额外信息,参见第二节中的 'Podfile 与 Podfile.lock'。
若工程A有不同的分支,则第一次切换分支时,需要再次执行 pod install,以将文件关联到主工程中。
在进行分支操作之后,若发现文件显示不全(Xcode中未显示,但文件夹中有相应文件),可执行 pod install,以将文件关联到主工程中。
通过 Pod 引入的本地依赖库。若想向其中添加文件或文件夹,需要首先将实体文件或文件夹加入依赖库中,而后执行 pod install。
将本地工程作A为依赖项,使用 pod 进行管理:
pod 'name', :path => '相对路径'
name为工程中的 .podspec 文件的名称。
而后执行 pod install。
pod 删除库:
在 Podfile 中删除相应 pod 语句,而后执行 pod install.
M1芯片 运行 pod install 命令,程序崩溃:
sudo arch -x86_64 gem install ffi
而后,在工程目录下
arch -x86_64 pod install
也可:终端应用程序 => 显示简介 => 使用 Rosetta 打开
WARNING: You don't have /Users/lilong.zhu/.local/share/gem/ruby/2.6.0/bin in your PATH, gem executables will not run.
解决方法:PATH="ruby -e 'puts Gem.user_dir'/bin:$PATH"
本节参考文章:
- iOS组件化之subspec子组件分文件夹
- cocoaPods之subspec子组件
- Podspec Syntax Reference
- pod install vs. pod update
- cocoapods 组件化(1)
二、原理
target 'Demo' do
pod 'Alamofire', :path => './Alamofire'
end
编译之后,工程的目录如下:
Podfile 的配置是围绕 Xcode 的工程结构:Workspace、Project、Target、Build Setting 来展开的。
作为包管理工具,CocoaPods 将所管理的 Pods 依赖库组装成一个个 Target,统一放入 Pods project 中的 Demo target,并自动配置好 Target 间的依赖关系。
之后将 Example 主工程和 Pods 工程一起打包到新建的 Example.workspace,配置好主工程与 Pods 工程之间的依赖,完成最终转换。
-
Target: 是工程中的最小可编译单元。根据 Build Settings、Build Phases 等设置,对源码进行编译。
-
Project: 是一个或多个 Target 的资源管理器,本身无法被编译。Project 所管理的资源都来自于所包含的 Target。
-
Workspace: 用于管理项目中的 project。同一个 Workspace 中的 Proejct 文件对于其他 Project 是默认可见的。一个 Project 可以被包含在多个不同的 Workspace 中。
-
Podfile 与 Podfile.lock: 当项目中要引入一个新的依赖库时,需要先更新 Podfile 文件,而后执行
pod install(假设此时安装的版本是 1.0),之后 Cocoapods 会更新 Podfile.lock,以将新依赖库的相关信息写入文件。
此后,只要不在 Podfile 里更改该依赖库的信息或不执行 pod update,则无论执行多少次 pod install,安装的库的版本均为 1.0.
在执行pod update时,Cocoapods 不会检查 Podfile.lock 里记录的相关信息。在满足当前 Podfile 里对于相关库的版本的限制的前提下,Cocoapods 会将 Pod 库更新到最新版本。
额外信息,参见第一节中的 'pod update 与 pod install'。
-
Podfile: 用于描述一个或多个 Project 中各个 Target 之间的依赖关系。
-
Podfile.lock: 用于记录最后一次 CocoaPods 所安装的 Pod 依赖库版本的信息快照。记录了每个已安装的 Pod 仓库的版本,并且锁定这些版本。 Key | 含义 | | -------------------- | ---------------------------------------------------- | | PODS | 记录 app 中所有 Pod 库的实际安装版本号,并且包含了库之间的依赖关系 | | DEPENDENCIES | 记录各 Pod 库的可引用版本,此处可以限定为具体某个版本,或者限定最低版本等| | SPEC REPOS | 记录了 app 使用的私有源、默认的 Cocoapods 的源 | | EXTERNAL SOURCES | 记录通过外部引入的 Pod 库(Git 引入、Path 引入,这些库未被发布到上一栏所记录的源)| | CHECKOUT OPTIONS | 部分引入的 Pod 库未被包含在源之中,此处记录了这部分库的来源(git、tag、commit等信息) | | SPEC CHECKSUMS | 记录当前各 Pod 库的 Podspec 文件 Hash 值,其实就是文件的 md5 | COCOAPODS | 记录上次所使用的 CocoaPods 版本
本节参考文章: