RubyGems 导航菜单
指南

使用常见的 RubyGems 命令

The gem 命令允许你与 RubyGems 交互。

Ruby 1.9 及更高版本附带内置的 RubyGems,但你可能需要升级以修复 bug 或获得新功能。要升级 RubyGems,请访问 下载 页面。

如果你想了解如何从 gem 中加载文件,请跳到 什么是 gem

查找 Gems

The search 命令允许你按名称查找远程 gems。你可以在你的查询中使用正则表达式字符

$ 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,你可以添加详细信息选项。不过,你应该对少量 gem 执行此操作,因为列出带有详细信息的 gem 需要下载更多文件

$ gem search ^rails$ -d

*** REMOTE GEMS ***

rails (7.0.3)
    Author: David Heinemeier Hansson
    Homepage: http://rubyonrails.net.cn

    Full-stack web application framework.

你也可以在 rubygems.org 上搜索 gems,例如 此 rake 搜索

安装 Gems

命令 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,该 gem 包含扩展。Ruby 会安装依赖项 rbtree 并构建其扩展,安装 drip gem,然后为已安装的 gem 生成文档。

在安装 gem 时,可以使用 --no-document 参数禁用文档生成。

代码需求

RubyGems 会修改您的 Ruby 加载路径,该路径控制 Ruby 代码如何被 require 语句找到。当您 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

列出已安装的 Gems

命令 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 等。

卸载 Gems

命令 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.
------------------------------------------------------------------------

获取和解压缩 Gems

如果您希望在不安装 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 命令的完整参考,请参阅 命令参考