关于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
文件,目录结构如下所示。
在 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
运行程序:
这样,我们就可以调试
Cocoapods
源码了。
Pod Install
在执行Pod Install
的过程中,查看函数调用栈,我们可以看出:
首先会执行Pod::Command.run(ARGV)
参数为:
["install","--verbose"]
,Command
继承CLAide::Command
,CLAide
是一个命令解释器,关于CLAid
有兴趣的可以参考大神瓜地的CocoaPods 命令解析 - CLAide。
单步执行
程序,通过CLAide
的解析后,代码执行到install.rb
文件下的 run
方法
首先判断 Podfile
文件是否存在,如果不存在,就会抛出No 'Podfile' found in the project directory.
的异常。
如果文件的扩展名为 "" .podfile .rb
,就将该文件,包装成podfile
对象。
我们在 Podfile
文件里面,向target
方法,传递了两个参数:targetName
和block
,在pod install
时,调用block
方法。
常见问题
[!] 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调试,有需要的可自行下载。