Cocoapods源码调试

关于Ruby调试环境的搭建和Ruby基本语法,可以参考这个文章合集 Ruby和Cocoapods文章合集

Cocoapods调试环境搭建

下载源码

我们在GitHub上,将 Cocoapods的源码下载到本地。

创建Xcode工程

在本地新建一个Xcode工程。进入工程的根目录,并创建一个Podfile文件。

platform :ios, '10.0'

use_frameworks!

target 'TestLibrary' do
    pod 'AFNetworking'
end
复制代码

创建Gemfile

Cocoapods源码和Xcode工程放到同一目录下,并在该目录下新建一个Gemfile文件, 文件的目录结构如下

├── CocoaPods
.
.
.
│   ├── lib

│   └── spec

├── Gemfile

└── TestLibrary

    ├── Podfile

    ├── TestLibrary

    ├── TestLibrary.xcodeproj

    └── build
复制代码

Gemfile中引入Ruby调试库。

source 'https://rubygems.org'
gem 'cocoapods', path: './CocoaPods' // 1
gem 'ruby-debug-ide' // 2
gem 'debase' // 3
复制代码
  • 1,指定CocoaPods路径。
  • 2,3 :Ruby调试的依赖库

创建 launch.json

使用VSCode打开目录文件夹,在根目录下,新建.vscode文件夹,在.vscode文件夹下,新建launch.json文件,目录结构如下所示。

截屏2021-08-29 下午10.17.46.png

launch.json中,配置程序启动参数:

{
    "configurations": [
    {
    "name": "Debug CocoaPods Plugin",
    "showDebuggerOutput": true,
    "type": "Ruby",
    "request": "launch",
    "useBundler": true,
    "cwd": "${workspaceRoot}/TestLibrary", //  1
    "program": "${workspaceRoot}/CocoaPods/bin/pod", // 2
    "args": ["install", "--verbose"], // 3
    }]
}
复制代码
  • 1,pod 命令执行的路径。会在该路径下寻找Podfile文件。
  • 2,指定使用的pod解释文件。
  • 3,执行的命令参数,在这里执行的是 pod install --verbose

bundle install

创建好工程依赖后,在终端执行bundle install,然后,在 Podfile里面设置一个断点,F5运行程序:

截屏2021-08-29 下午10.34.48.png 这样,我们就可以调试Cocoapods源码了。

Pod Install

在执行Pod Install的过程中,查看函数调用栈,我们可以看出:

首先会执行Pod::Command.run(ARGV) 截屏2021-08-29 下午11.21.27.png 参数为:["install","--verbose"]Command继承CLAide::CommandCLAide是一个命令解释器,关于CLAid有兴趣的可以参考大神瓜地的CocoaPods 命令解析 - CLAide

单步执行程序,通过CLAide的解析后,代码执行到install.rb文件下的 run方法

截屏2021-08-29 下午11.42.08.png

首先判断 Podfile文件是否存在,如果不存在,就会抛出No 'Podfile' found in the project directory.的异常。

如果文件的扩展名为 "" .podfile .rb,就将该文件,包装成podfile对象。

截屏2021-08-29 下午11.13.25.png

我们在 Podfile文件里面,向target方法,传递了两个参数:targetNameblock,在pod install时,调用block方法。 截屏2021-08-29 下午10.38.58.png

常见问题

[!] No `Podfile' found in the project directory.

在源码调试的时候,我们明明创建了Podfile文件,仍报这个错误,同时还报了一个警告

WARNING: CocoaPods requires your terminal to be using UTF-8 encoding.

    Consider adding the following to ~/.profile:

    export LANG=en_US.UTF-8
复制代码

.bash_profile或者.zshrc文件里面,添加export LANG=en_US.UTF-8 即可,就解决了这个问题。

示例工程

本文的调试工程,我已上传到Github Cocoapods调试,有需要的可自行下载。

分类:
iOS
标签: