使用常见的 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 命令的完整参考,请参阅 命令参考。