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 bundle exec pod install
调试
调试的逻辑和运行差不多,首先在 Cocoapods/lib/cocoapods/command.rb 中加一个断点:
RubyMine 主界面右上角 → Add Configuration → + → Ruby,新增 Ruby 的调试配置
which bundle
保存以后,点击 :beetle: 按钮就可以了。
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 配置:
{ "version": "0.2.0", "configurations": [ {"name": "AFNetworking", "type": "Ruby", "request": "launch", "useBundler": true, "showDebuggerOutput": true, "cwd": "${workspaceRoot}/CocoaPods/examples/AFNetworking Example", "program": "${workspaceRoot}/CocoaPods/bin/pod", "args": ["install"], } ] }
CocoaPods/Gemfile 需要新增两个 debug 的依赖,并重新 bundle install
:
gem "ruby-debug-ide" gem "debase"
断点并执行 Debug,效果大致如下: