使用常見 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"
提示:傳遞 -r
給 irb
會在載入 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 命令的完整參考,請參閱 命令參考。