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