iOS工程化「三」ruby&cocoaPods调试

578 阅读2分钟

Ruby

Ruby Vs Python

  • Python的解析器实现更成熟,第三方库质量高。但是Ruby包管理更简单、方便。对移动端开发者更友好。
  • Python的应用领域广泛。而Ruby目前主要局限在在Web领域与精致项目。
  • Python语法简单,Ruby更强大、灵活。

cocoapods完全是仿照Ruby引用第三方库的流程,并且cocoapods使用ruby来写的。使用ruby导入三方库的流程和cocoapods导入三方库的流程是一样的,只是他们使用的工具不一样。

image.png

我们如果要导入一个三方库,cocoapods去源里面搜索,搜索出来叫pod;ruby也是去源里面搜索,它搜索出来的叫Gemcocoapods就是开发者在ruby里面写的三方库,发表在ruby里面。ruby描述三方库是通过gemspec描述的,cocoapods描述第三方库是通过Podspec描述的。 下载三方库,cocoapods通过pod installruby使用bundler这个三方库,用bundle这个命令下载的。


管理工具:rvm&rbenv这两个管理和使用多个ruby环境的。

修改Gem镜像:

# 添加 TUNA 源并移除默认源
gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
# 列出已有源
gem sources -l

VSCode终端Shell配置,获取当前终端shell命令echo $0,在which zsh

image.png

VSCode``Shell配置要和终端保持一致。

image.png

VSCode是个桥梁,他通过一些插件去调用终端上安装好的一些工具,VSCode上安装的插件:

  • Ruby
  • Ruby Solargraph
  • Error Lens

终端需要安装三方库:

  1. gem install bundler 安装这个才能去项目里安装其他的三方库
  2. gem install ruby-debug-ide 提供了交互环境,和IDE之间建立通信的协议
  3. gem install debase 提供断点处理、堆栈信息
  4. gem install rubocop 代码风格检查器
  5. gem install solargraph 为Ruby提供智能感知,代码完成和内联文档

调试Ruby工程

Ruby插件调试Ruby是通过配置文件,VSCode运行的所有项目都是通过配置文件:

image.png

先下载一个Ruby工程,Xcodeproj,并用VSCode打开。

Ruby工具就是帮你生成一个launch.json文件去调试整个工程。我们先创建个launch.json文件,里面内容我们可以根据这个插件写的文档来修改。

image.png

image.png

image.png

image.png

按文档修改后,运行就多了个Debug LocalRuby项目一般暴露出来的命令都是在bin目录下,launch.json文件中的program参数就是启动项目代码,${workspaceRoot}代表工作区间,所以我们写的参数:"program": "${workspaceRoot}/bin/xcodeproj"

Ruby项目中,使用Gemfile管理三方库,要启动项目,首先要像cocoapods一样拉取三方库。在终端执行bundle install就可以了。 更新指定gem可以使用命令bundle install --conservative xxxxx

如果想新建一个Ruby的第三方库,只需要在终端执行bundle gem laribryName

启动项目,可以点按钮也可以直接按F5

启动后,可以看到报错:

image.png

看这个报错是rake版本不对,Gemfile文件里,rake版本是gem 'rake', '~> 12.0'

image.png

require可以理解为import,但是ruby里面没有header search pathruby里面引用三方库都是基于路径的。

Ruby语法里,$开头的变量是全局变量,可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初 始化的全局变量时,其值为 nil。 当你要require一个三方库时,就需要知道它的完整路径,在Ruby里面提供了一个$LOAD_PATH,就是当前项目里使用的路径,它就是把$LOAD_PATH定义的路径和require后面的名称拼到一起,组成一个完整路径。 Ruby项目中使用bundler管理的三方库,bundler会把使用的三方库加到$LOAD_PATH里面,这样在工程里才能使用你依赖的三方库,同时还会把不需要的剔除掉。

使用的时候,引用的三方库会和系统默认三方库版本进行比较,当版本不一致时,就会报错。在终端输入gem info rake

image.png

Gemfile文件中rake版本改为13.0.6重新bundle install即可。再按F5,就可成功编译。

image.png


lanuch.json配置

  • debuggerPort:默认每开始调试一个ruby程序,默认都会申请一个调试端口,如果没有配置,默认是1234,如果要同时调试多个ruby项目,不修改的话端口就会起冲突,修改后就没有问题了。
  • cwd:当前的工作目录。
  • useBundler:默认不使用useBundler时,你调试使用的IDE是当前终端安装的IDE,如果启用了这个选项,会执行精确的配置选项,需要在Gemfile里面引入你要使用的ruby``IDE的版本。每个ruby的版本和它的调试编译器是配置到一起的,有可能终端安装的IDE和项目里用的IDE是不一样的,比如gem 'ruby-debug-ide', '2.7.3',这样就可以指定版本了。
  • env:可以配置当前ruby使用的环境,当你安装很多ruby版本时候,你不知道到vscode底用的是哪个,这个时候就可以配置环境变量指定路径。 里面参数获取可以在终端中输入printf "\n\"env\":{\n \"PATH\":\"$PATH\",\n \"GEM_HOME\":\"$GEM_HOME\",\n \"GEM_PATH\":\"$GEM_PATH\",\n \"RUBY_VERSION\":\"$RUBY_VERSION\"\n}\n\n"
{
	"version": "0.2.0",
	"configurations": [
		{
			"name": "Pods Debug",
			"type": "Ruby",
			"request": "launch",
			"cwd": "${workspaceRoot}",
			"debuggerPort": "1234",
			// "useBundler": false,
			"program": "${workspaceRoot}/CocoaPods-master/bin/pod",
			"args": [
				"install",
				"--project-directory=./podTest"
			],
			"env": {
				"PATH":"/Users/shangjie/.rvm/gems/ruby-2.7.3/bin:/Users/shangjie/.rvm/gems/ruby-2.7.3@global/bin:/Users/shangjie/.rvm/rubies/ruby-2.7.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/shangjie/.rvm/bin:/Users/shangjie/flutter/bin:/Users/shangjie/thirdpartyLib/custom:/Users/shangjie/.rvm/bin",
 				"GEM_HOME":"/Users/shangjie/.rvm/gems/ruby-2.7.3",
 				"GEM_PATH":"/Users/shangjie/.rvm/gems/ruby-2.7.3:/Users/shangjie/.rvm/gems/ruby-2.7.3@global",
 				"RUBY_VERSION":"ruby-2.7.3",
				"LANG":"en_US.UTF-8"
			}
		}
	]
}

调试CocoaPods

接下来在github中下载CocoaPods项目。 打开项目先创建lanuch.json文件,并修改

{
	"version": "0.2.0",
	"configurations": [
		{
			"name": "Pods Debug",
			"type": "Ruby",
			"request": "launch",
			"program": "${workspaceRoot}/bin/pod"
		}
	]
}

在终端中执行bundle install,还是会报rake版本问题,修改依赖版本再bundle install,按F5启动,就会成功了。

image.png

可以看到控制台输出内容,有点熟悉,打开终端直接输入pod

image.png

可以看到输出内容一样,证明项目启动成功。 为了证明这个pod和终端pod一样都能使用,创建个App项目,放在CocoaPods-master同级目录,创建Podifle文件,随便引入一个三方库pod 'SJPopMenu',并且把.vscode和里面launch.json文件移到这个目录下:

image.png

路径变了,修改launch.json里面的program:"program": "${workspaceRoot}/CocoaPods-master/bin/pod",接下来我要执行pod命令,执行命令要传递参数,传递参数用args这个变量,这个变量是个数组,首先第一个肯定是install,然后我想跑一下这个projectpod有个命令pod install --project-directory=PATH,可以直接指定Podfile的路径,第二个参数:"--project-directory=./podTest",最后文件内容:

{
	"version": "0.2.0",
	"configurations": [
		{
			"name": "Pods Debug",
			"type": "Ruby",
			"request": "launch",
			"cwd": "${workspaceRoot}",
			"debuggerPort": "1234",
			// "useBundler": false,
			"program": "${workspaceRoot}/CocoaPods-master/bin/pod",
			"args": [
				"install",
				"--project-directory=./podTest"
			],
			"env": {
				"PATH":"/Users/shangjie/.rvm/gems/ruby-2.7.3/bin:/Users/shangjie/.rvm/gems/ruby-2.7.3@global/bin:/Users/shangjie/.rvm/rubies/ruby-2.7.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/shangjie/.rvm/bin:/Users/shangjie/flutter/bin:/Users/shangjie/thirdpartyLib/custom:/Users/shangjie/.rvm/bin",
 				"GEM_HOME":"/Users/shangjie/.rvm/gems/ruby-2.7.3",
 				"GEM_PATH":"/Users/shangjie/.rvm/gems/ruby-2.7.3:/Users/shangjie/.rvm/gems/ruby-2.7.3@global",
 				"RUBY_VERSION":"ruby-2.7.3",
				"LANG":"en_US.UTF-8"
			}
		}
	]
}

F5运行,就看到输出:

image.png

虽然报错,但是项目已经成功pod并且编译通过。