CocoaPods - 如何调试
简单的用 RubyMine 对 CocoaPods 进行调试,当然 VSCode 也可以,大同小异。
环境信息
RubyMine 2020.3
CocoaPods 1.8.4
Ruby 2.7.1
之前写了一篇关于 CocoaPods 的博客,但感觉比较流水账,所以删掉了。后续这个系列的文章尽量短小,一篇就说清楚一件事就行。源码阅读需要专注,文章太长不利于理解性的阅读。
CocoaPods 源码
Cocoapods 的代码并不全都在 Cocoapods/Cocoapods 项目中,而是拆分为了多个 Repo。在 Cocoapods README 的最后,对这些项目进行了简述:
- CocoaPods: Cocoapods 命令行工具
- CocoaPods Core: 处理 space 与 podfile,比如 Podfile DSL 的定义就在这个项目中
- CocoaPods Downloader: 下载器
- Xcodeproj: 解析 .xcodeproj 文件解析
- CLAide: 命令行参数解析器
- Molinillo: 依赖分析
- CocoaPods.app: 比较像 Cocoapods 的 UI 版本,包含一些功能增强,比如 Podfile 联想
- Master repository: Spec 仓库
其中最后两个都不是源代码,可以先不去关心。剩下的仓库,可以全部 clone 下来。
环境配置
- 将以上仓库都 clone 下来,Cocoapods 项目作为入口,修改 Cocoapods/Gemfile,指定每个依赖的
path
:
组件版本问题
在 clone 过程中,注意 CocoaPods/Gemfile.lock 中依赖的组件版本。
比如在 CocoaPods 1.8.4 中,XcodeProj 依赖的是 1.13.0 这个 tag,而不是最新的 master。如果直接进行接下来的 bundle install 可能会出现版本仲裁错误。做法是,checkout XcodeProj 到 1.13.0 这个 tag。
- Cocoapods 目录下,执行
bundle install
Debug
在 CocoaPods/examples 下面已经包含一些 Example 工程,可以直接用来进行调试。
运行
按运行的逻辑,首先是进入某个 Example,然后 pod install
,所以步骤是:
cd CocoaPods/examples/AFNetworking\ Example |
调试
调试的逻辑和运行差不多,首先在 Cocoapods/lib/cocoapods/command.rb 中加一个断点:
RubyMine 主界面右上角 → Add Configuration → + → Ruby,新增 Ruby 的调试配置
- Ruby script:命令所在位置,因为是以 bundle 的形式执行的,所以配置 bundle 的安装路径。可以用
which bundle
知道当前所用 bundle 安装在哪里 - Script arguments:剩余的命令
- Working directory:某个 Example 的路径,调试自己的工程可以改为自己工程的目录
保存以后,点击 🐞 按钮就可以了。
Ruby script
既然 CocoaPods 的源码已经拉到本地,Ruby script 也可以直接指向本地的 pod 命令:xxx/CocoaPods/bin/pod,相对的 Script arguments 为 install 即可。
Tips
断点时机
pod 命令的入口大多在 CocoaPods/lib/cocoapods/command/ 目录下。比如 pod install
对应着 install.rb 中的 run
方法。
VSCode 调试
新增 launch.json,并写入 debug 配置:
{ |
CocoaPods/Gemfile 需要新增两个 debug 的依赖,并重新 bundle install
:
gem "ruby-debug-ide" |
断点并执行 Debug,效果大致如下: