前言
Cocoapods大家应该非常熟悉了,但是一般很少有人去看源码,那就更少人去写插件了,如果要全局掌控工程架构,那必须熟悉这些插件的使用,而且还有个问题,即使你写插件,但是网上根本找不到资料告诉你如何调试插件源码,本文根据找到的极少数的资料,做了一丢丢笔记。
Cocoapods-Plugins开发
首先介绍下关于插件的开发,这一点官方资料根本少的可怜,或者是压根没有How to use CocoaPods plugins,仅有这个文章可以看看。
RVM环境安装
首先,由于Mac自带的Ruby环境,你如果要装包,每次需要 sudo命名,所以这里推荐大家使用rvm进行环境管理。
中文版安装教程
或者参考官方的教程
\curl -sSL https://get.rvm.io | bash -s stable
可以先跳过gpg的安装,这里直接进行安装,如果提示什么错误或者步骤,跟着提示安装即可。
安装rvm后,这里我安装了一个2.7.0的ruby环境进行测试,系统的还是2.6版本
$ rvm list
=* ruby-2.7.0 [ x86_64 ]
rvm use system
rvm use 2.7.0
需要注意的是,rvm切换的环境,各自的包都是独立管理的,比如你系统2.6下面安装了1.7.5的Cocoapods,那么你就需要重新再2.7.0的环境中再次安装新的所需的Cocoapods,这个安装过程就不多说了,直接通过命令查看,缺什么就装什么
gem list查看安装的gem包
pod plugins installed 查看已有的插件
插件编写
1.模板创建
pod plugins create jxbin
2.进入文件夹目录分析

这里的lib文件夹就是核心工作目录,有两种形式,一种是终端命令形式,一种就是Cocoapods的插件形式。
3.命令行形式
修改command/jxbin.rb
def run
UI.puts "命令行插件"
UI.puts "Add your implementation for the cocoapods-jxbin plugin in #{__FILE__}"
end
4.编译安装
gem build cocoapods-jxbin.gemspec
gem install cocoapods-jxbin-0.0.1.gem
# 查看已安装插件
pod plugins installed
# 测试插件命令 就能打印出我们添加的log
pod jxbin .
5.Podfile插件
lib/cocoapods_plugin.rb中添加hook操作
module CocoapodsJXBin
Pod::HooksManager.register('cocoapods-jxbin', :post_install) do |context|
a=100
b=200
c=a+b
Pod::UI.puts "断点进来啦"
Pod::UI.puts "恭喜你,pod install 成功 做点什么吧"
end
end
这里是hook的pod install,我们还可以hook其他的,至于hook了哪些操作,可以在pod plugins installed中体现出来

同上面的命令行一样,这次我们需修改对应的版本号,然后执行build和install操作就把最新的本地插件安装好了。
然后我们可以通过pod lib create xxx或者自己手动建一个项目,打开podfile文件,添加插件
plugin 'cocoapods-jxbin'
platform :ios, '8.0'
target 'MKJManager_Example' do
pod 'MKJManager', :path => '../'
target 'MKJManager_Tests' do
inherit! :search_paths
end
end
然后执行pod install就可以执行插件的内容了,编写插件的步骤不多,主要是结合这个框架写对应的功能,还有一个就是如何调试自己编写的插件或者Cocoapods源码。
插件源码调试
1.准备源码
这里我们先用别人已经提交到Gem仓库的第三方插件,看看是如何调试Cocoapods和Cocoapods-plugins的。
- 下载
Cocoapods源码
从github上下载对应的tag,比如这里我们用1.9.3进行调试 - 下载
Cocoapods-bin插件
从github上下载对应的插件 - 新建Demo工程
pod lib create xxx新建一个测试工程
那么结构现在看起来是这样的
├── CocoaPods-1.9.3
├── MKJManager
└── cocoapods-bin-master
这里你随便建一个文件夹,把这三个文件放到一起即可。
2.Gemfile
在同级目录下新建Gemfile,内容如下
source 'https://gems.ruby-china.com'
gem 'cocoapods', path: '/Users/mikejing/Desktop/RubyDemo/CocoaPods-1.9.3'
gem 'cocoapods-bin', path: '/Users/mikejing/Desktop/RubyDemo/cocoapods-bin-master'
group :debug do
gem 'ruby-debug-ide'
gem 'debase'
end
这个内容可以参考我们平时写的Podfile文件,source就是下载包的源,gem 'xxxxx'的形式是默认从源仓库下载,那么我们一样可以通过path指向本地源码,上面我们把cocoapods和cocoapods-bin做了特殊指向。
然后在根目录下执行bundle install,把所有依赖安装到这个项目中。
以下是更合理的做法
因为我们是调试某个gem库,为了不影响我们已经安装的,安装依赖的时候,最好是安装到当前文件夹下的执行目录中去 ruby的依赖包管理工具
bundle,如果配置了config文件的话,是可以在配置文件中声明安装的目录的 在当前目录 建立./bundle/config文件
text BUNDLE_PATH: "vendor/bundle"随后执行bundle install会把依赖安装到./vender/bundle目录下
3.配置RubyMine
网上仅有的资料也是VSCode进行调试,这里咱们用RubyMine来测试。
用RubyMine打开整个根目录,然后编辑以下配置


这个是Gem Command的模板,点击右上角Create configuration创建一个实体
-
Gem Name
这个是咱们要调试插件的名称列表,我们这里输入cocoapods-bin,图上是提供的cocoapods-binary,这里可以根据需要选择,但是前提是,你输入的时候,这里是会有提示的,如果没有提示,只能说明插件你还没安装成功

-
Executable name
输入 pod(这个可以固定,因为这是宿主程序,这个也是输入,就出现可选项,如果没出现pod,那么应该是你的Ruby SDK没有选好)

-
Arguments
这里我们测试一下Podfile中插件的调试,因此我们需要在宿主Demo中执行pod install,所以这里我们参数直接填写install即可。 -
Working directory
和上面的参数对应,如果是pod install,那么这里,我们需要指定Demo工程podfile文件所在的目录,不然执行的时候会报错,找不到podfile文件。 -
Ruby SDK
这里的SDK有默认值,如果像我们这样用RVM安装多环境,就需要选择对应的环境SDK,一般都是和Demo工程或者下载下来的Cocoapods-master版本一致(podlock文件中可以查看当前安装版本),也就是需要选择和cocoapods所存在的当前Ruby环境,这里是1.9.3,存在于RVM Ruby 2.7.0的环境中

-
Bundlertab
勾选对应的Bundler选项

OK,一切就绪,我们捋一下整个配置过程以及会生效的Ruby文件。
Gem选项选择我们需要调试的插件- 添加执行命令和参数
pod install或者pod bin init - 查看是否需要指定目录执行命令
- 勾选
Bundler执行脚本 - 配置好后点击小爬虫进行调试
4.调试源码
上面我们配置了pod install的参数来调试cocoapods-bin插件,而且在Demo工程的podfile文件中添加了plugin 'cocoapods-bin'参数,这里我们可以在cocoapods-bin-master/lib/cocoapods-bin/source_provider_hook.rb中看到这里Hook了两个方法,打上断点,点击小爬虫,就能看到如下调试信息

那么如果想调试单条命令比如pod bin init,那么只需要更改或者配置新的configuration,区别于把arguments从install改成bin init,working directory就不需要了,因为我们现在是命令行调试,不依赖于任何Demo中的Podfile,然后再次点击小爬虫即可。

5.调试自己编写的插件
上面已经描述了第三方插件的调试,那么我们自己写的插件cocoapods-jxbin也是同理,前提是我们需要把我们编写的插件安装好
gem build xxxxxx.gemspec
gem install xxxxxx.0.0.1-gem
# 以下命令能查看到即可
pod plugins installed
然后把目录移到上面的根目录下,那么他看起来是这样的

记得在Gemfile中添加一条执行源码的命令
gem 'cocoapods-jxbin', path: '/Users/mikejing/Desktop/RubyDemo/cocoapods-jxbin'
然后还是配置configuration,咱们自己写的插件有两种形式,分别是podfile插件和命令行插件,分别对应cocoapods-jxbin/lib/cocoapods-plugin.rb和cocoapods-jxbin/lib/cocoapods-jxbin/command/jxbin.rb,打上断点,前者配置pod install,或者配置pod jxbin .就可以进行源码调试了,如下图


以上就是自己实践的调试方式了,后续咱就可以愉快的进行Ruby脚本或者插件开发了。
参考文章:
Cocoapods 插件调试环境配置
带瓶老师的调试总结
本文详细介绍了Cocoapods插件的开发流程,包括环境搭建、插件编写及调试方法。通过实际案例,讲解了如何使用RVM管理Ruby环境,创建并调试Cocoapods插件,适合希望深入理解Cocoapods内部机制的开发者。
20





