开发工具记录

228 阅读6分钟

一、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"

本节参考文章:

  1. iOS组件化之subspec子组件分文件夹
  2. cocoaPods之subspec子组件
  3. Podspec Syntax Reference
  4. pod install vs. pod update
  5. cocoapods 组件化(1)

二、原理

target 'Demo' do 
        pod 'Alamofire', :path => './Alamofire' 
end

 编译之后,工程的目录如下:

image.png

 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 版本

本节参考文章:

  1. Podfile 的解析逻辑
  2. 看懂Podfile.lock