RubyGems 導覽選單
指南

使用常見 RubyGems 指令

gem 指令允許你與 RubyGems 互動。

Ruby 1.9 及更新版本內建 RubyGems,但你可能需要升級以取得錯誤修正或新功能。若要升級 RubyGems,請造訪 下載 頁面。

如果你想了解如何從寶石中載入檔案,請跳至 什麼是寶石

尋找寶石

search 命令讓您可以依名稱尋找遠端 Gem。您可以在查詢中使用正規表示式字元

$ gem search ^rails

*** REMOTE GEMS ***

rails (7.0.3)
rails-3-settings (0.1.1)
rails-acm (0.1.0)
rails-action-args (0.1.1)
rails-action-authorization (1.1.2)
[...]

如果您看到一個 Gem 並希望取得更多資訊,您可以新增 details 選項。不過,您會希望對少數 Gem 執行此操作,因為列出詳細資訊的 Gem 需要下載更多檔案

$ gem search ^rails$ -d

*** REMOTE GEMS ***

rails (7.0.3)
    Author: David Heinemeier Hansson
    Homepage: https://rubyonrails.org

    Full-stack web application framework.

您也可以在 rubygems.org 上搜尋 Gem,例如 搜尋 rake

安裝寶石

install 命令會下載並安裝 Gem 和任何必要的相依性,然後為已安裝的 Gem 建立文件。

$ gem install drip
Fetching drip-0.1.1.gem
Fetching rbtree-0.4.5.gem
Building native extensions. This could take a while...
Successfully installed rbtree-0.4.5
Successfully installed drip-0.1.1
Parsing documentation for rbtree-0.4.5
Installing ri documentation for rbtree-0.4.5
Parsing documentation for drip-0.1.1
Installing ri documentation for drip-0.1.1
Done installing documentation for rbtree, drip after 0 seconds
2 gems installed

這裡的 drip 命令會依賴於 rbtree Gem,而 rbtree Gem 有擴充功能。Ruby 會安裝相依性 rbtree 並建立其擴充功能,安裝 drip Gem,然後為已安裝的 Gem 建立文件。

您可以在安裝 Gem 時使用 --no-document 參數來停用文件產生。

需要程式碼

RubyGems 會修改您的 Ruby 載入路徑,這會控制 require 陳述式如何找到您的 Ruby 程式碼。當您 require 一個 Gem 時,您實際上只是將該 Gem 的 lib 目錄放置到您的 $LOAD_PATH 中。我們在 irb 中試試看。

% irb
irb(main):001:0> pp $LOAD_PATH
[".../lib/ruby/site_ruby/3.1.0",
 ".../lib/ruby/site_ruby/3.1.0/x86_64-linux",
 ".../lib/ruby/site_ruby",
 ".../lib/ruby/vendor_ruby/3.1.0",
 ".../lib/ruby/vendor_ruby/3.1.0/x86_64-linux",
 ".../lib/ruby/vendor_ruby",
 ".../lib/ruby/3.1.0",
 ".../lib/ruby/3.1.0/x86_64-linux"]

預設情況下,載入路徑中只有幾個系統目錄和 Ruby 標準函式庫。若要將 awesome_print 目錄新增到載入路徑,您可以需要它的其中一個檔案

$ gem install awesome_print
[...]
$ irb
irb(main):001:0> require "ap"
=> true
irb(main):002:0> pp $LOAD_PATH.first
".../gems/awesome_print-1.9.2/lib"

提示:傳遞 -rirb 會在載入 irb 時自動需要一個函式庫。

$ irb -rap
irb(main):001:0> ap $LOAD_PATH
[
    [0] ".../bundle/gems/awesome_print-1.9.2/lib",
    [1] ".../lib/ruby/site_ruby/3.1.0",
    [2] ".../lib/ruby/site_ruby/3.1.0/x86_64-linux",
    [3] ".../lib/ruby/site_ruby",
    [4] ".../lib/ruby/vendor_ruby/3.1.0",
    [5] ".../lib/ruby/vendor_ruby/3.1.0/x86_64-linux",
    [6] ".../lib/ruby/vendor_ruby",
    [7] ".../lib/ruby/3.1.0",
    [8] ".../lib/ruby/3.1.0/x86_64-linux"
]

您需要 ap 之後,RubyGems 會自動將其 lib 目錄放置到 $LOAD_PATH 中。

基本上,這就是 Gem 中的內容。將 Ruby 程式碼放入 lib 中,將 Ruby 檔案命名為與您的 Gem 相同(對於 Gem “freewill”,檔案應該是 freewill.rb,另請參閱 為您的 Gem 命名),然後它就可以由 RubyGems 載入。

通常,lib 目錄本身只包含一個 .rb 檔案和一個與 gem 同名的目錄,其中包含其餘檔案。

例如

% tree freewill/
freewill/
└── lib/
    ├── freewill/
    │   ├── user.rb
    │   ├── widget.rb
    │   └── ...
    └── freewill.rb

列出已安裝的 Gem

list 命令會顯示您已在本機安裝的 gem

$ gem list

*** LOCAL GEMS ***

abbrev (default: 0.1.0)
awesome_print (1.9.2)
base64 (default: 0.1.1)
benchmark (default: 0.2.0)
bigdecimal (default: 3.1.1)
bundler (default: 2.3.7)
cgi (default: 0.3.1)
csv (default: 3.2.2)
date (default: 3.2.2)
debug (1.4.0)
delegate (default: 0.2.0)
did_you_mean (default: 1.6.1)
digest (default: 3.1.0)
drb (default: 2.1.0)
drip (0.1.1)
english (default: 0.7.1)
[...]

清單包含預設 gem 和已綑綁 gem,兩者預設皆隨 Ruby 一起提供。在 Ruby 3.1 中,預設 gem 總共有 70 個,包括 bigdecimal、bundler、csv、did_you_mean 等,而已綑綁 gem 則有 debug、rake 等。

解除安裝 Gem

uninstall 命令會移除您已安裝的 gem。

$ gem uninstall drip
Successfully uninstalled drip-0.1.1

如果您解除安裝 gem 的依賴項,RubyGems 會要求您確認。

$ gem uninstall rbtree

You have requested to uninstall the gem:
        rbtree-0.4.5

drip-0.1.1 depends on rbtree (>= 0)
If you remove this gem, these dependencies will not be met.
Continue with Uninstall? [yN]  n
ERROR:  While executing gem ... (Gem::DependencyRemovalException)
    Uninstallation aborted due to dependent gem(s)

檢視文件

您可以使用 ri 來檢視已安裝 gem 的文件。

$ ri RBTree
= RBTree < MultiRBTree

(from gem rbtree-0.4.5)
------------------------------------------------------------------------
A sorted associative collection that cannot contain duplicate keys.
RBTree is a subclass of MultiRBTree.
------------------------------------------------------------------------

擷取並解壓縮 Gem

如果您想要稽核 gem 的內容,而不需要安裝它,您可以使用 fetch 命令來下載 .gem 檔案,然後使用 unpack 命令來解壓縮其內容。

$ gem fetch malice
Fetching malice-13.gem
Downloaded malice-13
$ gem unpack malice-13.gem
Unpacked gem: '.../malice-13'
$ more malice-13/README

Malice v. 13

DESCRIPTION

A small, malicious library.

[...]
$ rm -r malice-13*

您也可以解壓縮已安裝的 gem,修改幾個檔案,然後使用已修改的 gem 來取代已安裝的 gem

$ gem unpack rake
Unpacked gem: '.../13.0.6'
$ vim 13.0.6/lib/rake/...
$ ruby -I 13.0.6/lib -S rake some_rake_task
[...]

-I 參數會將您解壓縮的 rake 加入到 ruby $LOAD_PATH 中,這會防止 RubyGems 載入 gem 版本(或預設版本)。-S 參數會在 shell 的 $PATH 中找到 rake,因此您不需要輸入完整路徑。

進一步閱讀

本指南僅顯示使用 gem 命令的基本知識。如需瞭解 gem 內部資訊以及如何使用已安裝 gem 的資訊,請參閱下一節,什麼是 gem。如需 gem 命令的完整參考,請參閱 命令參考