Ruby 程式開發工具初探

如果你是簡潔程式語法的愛好者,那麼你一定不能錯過 Ruby。

如果你更是推崇快速開發、驗證想法的 Web developer,Rails 也是你一個很好的選擇。

在這篇文章中將對於 Ruby, Rails developer 會使用到的工具以及基本概念簡單分享。


一、Ruby 版本管理工具

Ruby 語言的版本不斷發佈更新,目前已經到了 2.4.1,當在自己的電腦進行開發時,很可能會需要不同版本的 Ruby 同時安裝在電腦之中,這時候就需要版本管理工具,在 Ruby 中比較有名的有兩套工具:RVM 與 rbenv,以下針對較多人推薦使用的 rbenv 進行介紹。

*這兩套工具為互不相容的,只能選擇一種安裝,避免衝突產生問題

rbenv

首先使用 Homebrew 安裝(macOS):
brew update
brew install rbenv
brew install ruby-build # for rbenv install command
進行環境設定,根據使用的環境在不同檔案加入以下指令:
eval "$(rbenv init -)"
# macOS shell 使用的是 bash 加到 ~/.bash_profile
# macOS shell 使用的是 zsh 加到 ~/.zshrc
# Ubuntu shell 加到 ~/.bashrc
安裝 ruby
rbenv install --list # 列出所有可安裝版本
rbenv install 2.3.3 # 安裝特定版本
當有多個版本要設定預設版本:
rbenv global 2.3.3
指定當前目錄使用的版本(會產生 .rbenv-version 檔案)
rbenv local 2.3.3

rbenv 的工作原理是藉由截取執行 ruby, rake, pry 等等指令時的查找路徑 PATH 使其實際上是在 ~/.rbenv/shims執行 rbenv exec <command> 指令,而 rbenv 決定使用哪個 Ruby 版本有以下四個優先次序:

  1. 確認當前的 shell 是否有 RBENV_VERSION 這項變數,有則使用
  2. 執行指令的檔案目錄,以及其 parent 目錄直到 root 是否有 .rbenv-version 檔案,有則使用
  3. 當前目錄的檔案目錄,以及其 parent 目錄直到 root是否有 .rbenv-version 檔案,有則使用
  4. 以上都沒有就使用 ruby global 所設定的預設版本

二、Ruby Gem 版本相依管理工具

除了語言本身提供的眾多功能,Ruby 之所以被眾多人喜愛便是因為有許多 open source 的「Gem」,也就是 Ruby 開發者們製作的 Library,使得使用 Ruby 進行程式開發更快速、強大,例如知名的 Rails framework 也是一個 Ruby Gem。

而兩個 Gem 可能會相依於另一個相同的 Gem,當其指定的版本不相容時,便會發生問題,例如:A , B gem 都相依於 C gem,但 A 指定要 C 的 2.0.0 以上版本,而 B 指定要 C 的 1.9.3 以下版本,這時就會發生衝突。

因此我們需要版本相依管理套件,最有名的便是 Bundler。

Bundler

安裝:
gem install bundler

使用 Ruby Gem 範例:

  1. 首先先建立一個 .rb 檔,撰寫主要的 Ruby 程式邏輯
  2. 同一個資料夾下建立名為 Gemfile 的檔案,放置要使用的 Gem,以下為範例內容
source 'https://rubygems.org'
gem 'nokogiri'
gem 'rack', '~> 2.0.1'
gem 'rspec'

3. 在當前目錄輸入 bundle install 這個指令會安裝 Gemfile 中所指定的 gem,若有指定版本也會依照需求安裝,會產生一個 Gemfile.lock 檔案,裡面會指定最後安裝的 gem 版本以及其 dependency

4. 在 .rb 檔中 require 需要的 gem,例如 require "nokogiri" ,便可以使用

其餘功能:

bundle exec <command> : 使用 Gemfile 指定的 gem 版本執行指令,若不使用 bundle exec 則預設會使用最新版本的 command 執行。

bundle open <gem-name> :使用編輯器打開 Gemfile 指定該 gem 的原始碼,通常用於 debug 特定 gem 的內容

三、Debug 工具

撰寫程式時,常常需要設中斷點去 debug 查看該情境下的變數狀態,如果使用一些 IDE 可能只需要在要斷點的行數前面點一下出現紅點就會自動中斷,不過在使用 Text Editor 時就需要藉由 debug tool 嵌入程式碼中進行中斷除錯。而在 Ruby 中最有名的就是 pry。

使用方式:

  1. 在 Gemfile 中加入 pry gem
source 'https://rubygems.org'
gem "pry"

2. bundle install安裝 gem

3. 在要使用的 .rb 檔中 require "pry"

4. 在要設中斷點的地方輸入 binding.pry

# pry-test.rb
require "pry"
total = 0
arr = [1, 2, 3, 4, 5]
arr.each_with_index do |e, i|
total += e
if i == 2
binding.pry
end
end

5. 執行 Ruby 程式,當執行到該處便會中斷

ruby pry-test.rb
==> 停在 binding.pry 處, 此時 total = 6

binding.pry 的原理也相當有趣,在 Ruby 語言中,就定義了 BindingClass,而 binding 則是用來回傳一個 Binding 的 instance,此 instance 則記錄了當前的狀態,包含 self , local variable, methods 等等,而 pry 則可以對 Ruby Object 開啟一個 Pry session 進行 REPL (read-eval-print-loop),達成讓使用者 debug 的效果。

小結論

Ruby 是一個相當高度抽象化的語言,能用相當簡潔的程式碼達成複雜的任務,但隱藏在方便之下每一件事情、一個 Library 能達成的任務都有背後的原理,藉由探索事物的根源也能更了解他人是如何設計一個 solution、更靈活運用不同的工具。

延伸閱讀:

pry github : https://github.com/pry/pry

rbenv github : https://github.com/rbenv/rbenv

So what is “binding.pry” exactly? : http://kyrylo.hatenablog.com/entry/2013/05/29/so-what-is-binding-pry-exactly

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.