vscode近年来发展迅速,几乎在3年之间就抢占了原来vim、sublime text的不少份额,犹记得在2015-2016年的时候,ruby推荐的开发环境基本上都是vim和sublime text,然而,随着vscode的发展,vscode下ruby的开发体验已经很是不错。如今基本上使用win 10 wsl2 + vscode + windows terminal的体验已经不逊于mac + vim (sublime) + item 2的体验了ubuntu
使用win10专业版配置ruby开发环境大体分为如下几步:vim
通过以上7步就能够开始愉悦的ruby开发了,再开始以前,能够先看个效果图。windows
ruby对Linux和Mac比较友好,在windows下不少第三方库要配合mingw或msys2才能安装,不过好在windows 10提供了Linux子系统,在win10 2004版本中wsl也升级到了wsl2,速度更快,功能更完善。数组
要使用wsl2须要先在控制面板中开启wsl功能:ruby
目前wsl2还须要安装一个内核升级包,具体可参考微软说明:bash
更新包安装完成后,输入命令socket
wsl --set-default-version 2
在微软应用商店安装Ubuntu,当前Ubuntu版本为20.04 LTSide
安装完成之后,配置Ubuntu默认为wsl2函数
# 查看 wsl --list --verbose # 设置 wsl --set-version Ubuntu 2
在Linux下安装ruby有多种方法,比较主流的方法是RVM,不过为了简单起见,我直接经过ubuntu的apt工具进行了安装。工具
关于RVM的安装可参考以下网站:
经过APT安装,输入下列命令便可
sudo apt install ruby ruby-dev ri ruby-bundle
安装完成之后须要配置gem国内镜像,参考以下网址:
输入下列命令
# 设置gem source gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ # 查看gem source gem sources -l # 设置bundle bundle config mirror.https://rubygems.org https://gems.ruby-china.com
vscode直接在官网下载安装便可,这里我选择了System Installer
vscode安装完成之后,能够在plugin中找到Remote - WSL扩展,点击安装便可
直接在plugin中搜索ruby在wsl中安装下列五个扩展便可
其中,ruby solargraph
和rubocop
除了安装扩展,还须要经过gem安装第三方包
sudo gem install rubocop sudo gem install solargraph
从新加载vscode-wsl就能够愉快的使用ruby language进行开发了
在使用上基本只要require了相应的库,就solargraph就会对require的库中涉及的类和模块进行提示,很是方便。惟一有问题的地方就是require的时候没有提示,这可能就须要本身记一下库的名称,不过相比于原来已经好太多了,应该说在能够接受的范围内。
若是安装了sinatra这样的库,vscode-ruby如何给出提示呢?只须要Ctrl + Shift + P,选择solargraph: build new gem documention
便可
rubocop是一个Ruby Lint工具,能够进行Ruby代码风格检查,并可以自动修复,只须要Ctrl + Shift + P,选择Ruby: autocorrect by rubocop
便可
ruby是动态强类型语言,因为不须要指定函数返回值类型,这致使IDE没法自动推断一些变量的类型。目前Python、PHP、TypeScript都在不断的强化类型以方便IDE进行静态检查。IDE只有在知道类型的状况下才能准确地进行智能提示。
在ruby 2当中,咱们能够经过类型注释的方式加强IDE推断能力。常见的类型注释可参考YARD项目
下面代码给出了一些示例。
require 'socket' server = TCPServer.new 2000 loop do # 代码块参数类型注释 # @param {TCPSocket} client Thread.start(server.accept) do |client| client.puts 'hello !' client.puts "Time is #{Time.now}" client.close end end server = TCPServer.new 2000 loop do # 变量注释 # @type {TCPSocket} client client = server.accept end # 函数参数和返回值注释,数组类型 # @param {Array(Integer)} nums # @param {Integer} target # @return {Array(Integer)} def two_sum(nums, target) hash_nums = {} result = [] nums.each_with_index do |num, index| hash_nums[num] = index end nums.each_with_index do |num, index| another = target - num if hash_nums[another] && hash_nums[another] != index result.push(index, hash_nums[another]) break end end result end