Cocoapods
大家应该非常熟悉了,但是一般很少有人去看源码,那就更少人去写插件了,如果要全局掌控工程架构,那必须熟悉这些插件的使用,而且还有个问题,即使你写插件,但是网上根本找不到资料告诉你如何调试插件源码,本文根据找到的极少数的资料,做了一丢丢笔记。
首先介绍下关于插件的开发,这一点官方资料根本少的可怜,或者是压根没有How to use CocoaPods plugins,仅有这个文章可以看看。
首先,由于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源码。
这里我们先用别人已经提交到Gem
仓库的第三方插件,看看是如何调试Cocoapods
和Cocoapods-plugins
的。
Cocoapods
源码github
上下载对应的tag
,比如这里我们用1.9.3
进行调试Cocoapods-bin
插件github
上下载对应的插件pod lib create xxx
新建一个测试工程那么结构现在看起来是这样的
├── CocoaPods-1.9.3
├── MKJManager
└── cocoapods-bin-master
这里你随便建一个文件夹,把这三个文件放到一起即可。
在同级目录下新建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
目录下
网上仅有的资料也是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
的环境中
OK,一切就绪,我们捋一下整个配置过程以及会生效的Ruby文件。
Gem
选项选择我们需要调试的插件pod install
或者pod bin init
Bundler
执行脚本上面我们配置了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
,然后再次点击小爬虫即可。
上面已经描述了第三方插件的调试,那么我们自己写的插件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 插件调试环境配置
带瓶老师的调试总结