Ruby
Ruby Vs Python
- Python的解析器实现更成熟,第三方库质量高。但是Ruby包管理更简单、方便。对移动端开发者更友好。
- Python的应用领域广泛。而Ruby目前主要局限在在Web领域与精致项目。
- Python语法简单,Ruby更强大、灵活。
cocoapods完全是仿照Ruby引用第三方库的流程,并且cocoapods使用ruby来写的。使用ruby导入三方库的流程和cocoapods导入三方库的流程是一样的,只是他们使用的工具不一样。
我们如果要导入一个三方库,cocoapods去源里面搜索,搜索出来叫pod;ruby也是去源里面搜索,它搜索出来的叫Gem。
cocoapods就是开发者在ruby里面写的三方库,发表在ruby里面。ruby描述三方库是通过gemspec描述的,cocoapods描述第三方库是通过Podspec描述的。
下载三方库,cocoapods通过pod install,ruby使用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
VSCode``Shell配置要和终端保持一致。
VSCode是个桥梁,他通过一些插件去调用终端上安装好的一些工具,VSCode上安装的插件:
- Ruby
- Ruby Solargraph
- Error Lens
终端需要安装三方库:
gem install bundler安装这个才能去项目里安装其他的三方库gem install ruby-debug-ide提供了交互环境,和IDE之间建立通信的协议gem install debase提供断点处理、堆栈信息gem install rubocop代码风格检查器gem install solargraph为Ruby提供智能感知,代码完成和内联文档
调试Ruby工程
Ruby插件调试Ruby是通过配置文件,VSCode运行的所有项目都是通过配置文件:
先下载一个Ruby工程,Xcodeproj,并用VSCode打开。
Ruby工具就是帮你生成一个launch.json文件去调试整个工程。我们先创建个launch.json文件,里面内容我们可以根据这个插件写的文档来修改。
按文档修改后,运行就多了个Debug Local。Ruby项目一般暴露出来的命令都是在bin目录下,launch.json文件中的program参数就是启动项目代码,${workspaceRoot}代表工作区间,所以我们写的参数:"program": "${workspaceRoot}/bin/xcodeproj"。
在Ruby项目中,使用Gemfile管理三方库,要启动项目,首先要像cocoapods一样拉取三方库。在终端执行bundle install就可以了。
更新指定gem可以使用命令bundle install --conservative xxxxx。
如果想新建一个Ruby的第三方库,只需要在终端执行bundle gem laribryName。
启动项目,可以点按钮也可以直接按F5。
启动后,可以看到报错:
看这个报错是rake版本不对,Gemfile文件里,rake版本是gem 'rake', '~> 12.0',
require可以理解为import,但是ruby里面没有header search path,ruby里面引用三方库都是基于路径的。
在Ruby语法里,$开头的变量是全局变量,可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初 始化的全局变量时,其值为 nil。
当你要require一个三方库时,就需要知道它的完整路径,在Ruby里面提供了一个$LOAD_PATH,就是当前项目里使用的路径,它就是把$LOAD_PATH定义的路径和require后面的名称拼到一起,组成一个完整路径。
Ruby项目中使用bundler管理的三方库,bundler会把使用的三方库加到$LOAD_PATH里面,这样在工程里才能使用你依赖的三方库,同时还会把不需要的剔除掉。
使用的时候,引用的三方库会和系统默认三方库版本进行比较,当版本不一致时,就会报错。在终端输入gem info rake
把Gemfile文件中rake版本改为13.0.6重新bundle install即可。再按F5,就可成功编译。
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启动,就会成功了。
可以看到控制台输出内容,有点熟悉,打开终端直接输入pod
可以看到输出内容一样,证明项目启动成功。
为了证明这个pod和终端pod一样都能使用,创建个App项目,放在CocoaPods-master同级目录,创建Podifle文件,随便引入一个三方库pod 'SJPopMenu',并且把.vscode和里面launch.json文件移到这个目录下:
路径变了,修改launch.json里面的program:"program": "${workspaceRoot}/CocoaPods-master/bin/pod",接下来我要执行pod命令,执行命令要传递参数,传递参数用args这个变量,这个变量是个数组,首先第一个肯定是install,然后我想跑一下这个project,pod有个命令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运行,就看到输出:
虽然报错,但是项目已经成功pod并且编译通过。