CocoaPods - 如何调试

CocoaPods - 如何调试

简单的用 RubyMine 对 CocoaPods 进行调试,当然 VSCode 也可以,大同小异。

环境信息
RubyMine 2020.3
CocoaPods 1.8.4
Ruby 2.7.1


之前写了一篇关于 CocoaPods 的博客,但感觉比较流水账,所以删掉了。后续这个系列的文章尽量短小,一篇就说清楚一件事就行。源码阅读需要专注,文章太长不利于理解性的阅读。

CocoaPods 源码

Cocoapods 的代码并不全都在 Cocoapods/Cocoapods 项目中,而是拆分为了多个 Repo。在 Cocoapods README 的最后,对这些项目进行了简述:

其中最后两个都不是源代码,可以先不去关心。剩下的仓库,可以全部 clone 下来。

环境配置

  1. 将以上仓库都 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。

  1. 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 的调试配置

  • 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 配置:

{
"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,效果大致如下: