RubyGems 导航菜单
指南

插件

使用 RubyGems 插件 API 的扩展。

RubyGems 将加载每个已安装宝石或 $LOAD_PATH 中最新版本的插件。插件必须命名为“rubygems_plugin”(.rb、.so 等)并放置在宝石的 #require_path 根目录下。插件安装在特殊位置并在启动时加载。

制作自己的插件

第一步是遵循传统的文件名,我们将使用 ruby 作为此示例并检查我们的插件是否已正确加载

% cat lib/rubygems_plugin.rb
puts 'hello from my plugin!'

% RUBYOPT=-Ilib gem
hello from my plugin!
RubyGems is a sophisticated package manager for Ruby.  This is a
basic help message containing pointers to more information.

  Usage:
[…]

当然,我们的插件最好打包成一个宝石,这在 制作自己的宝石 指南中进行了详细描述。

钩子

RubyGems 提供了各种钩子,我们可以使用它们来添加自定义功能,甚至修改 RubyGems 的行为。例如,现有的钩子允许在单个 gem 安装之前、构建之后、安装之后、所有 gem 安装之后以及其他许多情况下执行代码(请参阅 Gem 的代码和文档作为参考)。

让我们考虑一个简单的插件示例,它会在安装 gem 之前交互式地询问确认,同时支持白名单。我们将利用 pre_install 钩子,将一个代码块传递给 Gem.pre_install 方法。阅读此方法文档,我们了解到我们的钩子将使用 Gem::Installer 实例调用,并且我们可以返回 false 来中止安装。

% cat lib/rubygems_plugin.rb
WHITELIST_PATH = "#{ENV['HOME']}/.gem/install_audit/whitelist"

Gem.pre_install do |installer|
  gem_name = installer.spec.name
    whitelist = if File.exist? WHITELIST_PATH
    File.read(WHITELIST_PATH).split
  else
    []
  end

  unless whitelist.include? gem_name
    print "`#{gem_name}' is not whitelisted, install? (y/n): "
    case choice = $stdin.gets.chomp
      when /\Ay/i
      when /\An/i then next false
      else fail "cannot understand `#{choice}'"
    end
  end
end

% echo rake > ~/.gem/install_audit/whitelist

% RUBYOPT=-Ilib gem install hoe
Fetching: rake-12.3.0.gem (100%)
Successfully installed rake-12.3.0
Fetching: hoe-3.16.2.gem (100%)
`hoe' is not whitelisted, install? (y/n): y
Successfully installed hoe-3.16.2
2 gems installed

% RUBYOPT=-Ilib gem install pry
Fetching: coderay-1.1.2.gem (100%)
`coderay' is not whitelisted, install? (y/n): n
ERROR:  Error installing pry:
  pre-install hook at /…/lib/rubygems_plugin.rb:3 failed for coderay-1.1.2

正如预期的那样,RubyGems 在每个 gem 安装之前调用我们的钩子,当我们的钩子返回 false 时,它会中止并给出解释。

如果您发现插件系统 API 缺少您需要的扩展点,请阅读 RubyGems 源代码中的 CONTRIBUTING.rdoc,或查看 贡献指南。

命令

一些插件还会向 RubyGems CLI 添加自己的命令。例如,下面列出的 graph 插件以这种方式注册了自己的 graph 命令

require 'rubygems/command_manager'

Gem::CommandManager.instance.register_command :graph

并以类似的方式实现命令

require 'rubygems/command'

class Gem::Commands::GraphCommand < Gem::Command
  def initialize
    super 'graph', 'Graph dependency relationships of installed gems'
  end

  def execute
    # [real command implementation removed for this guide]
  end
end

然后,我们可以通过执行 gem graph 来使用它,它也像其他 RubyGems 内置命令一样被记录(gem help commandsgem help graph…)。

现有插件

以下 RubyGems 插件列表可能并不完整。如果您知道我们错过的插件,请随时更新此页面。

executable-hooks

https://github.com/mpapis/executable-hooks

扩展 rubygems 以支持可执行插件。

在 gem lib 目录中创建 rubygems_executable_plugin.rb

Gem.execute do |original_file|
  warn("Executing: #{original_file}")
end

gem-browse

https://github.com/tpope/gem-browse

添加四个命令

  • gem edit 在您的编辑器中打开一个 gem
  • gem open 在您的编辑器中按名称打开一个 gem
  • gem clone 从 GitHub 克隆一个 gem
  • gem browse 在您的浏览器中打开一个 gem 的主页

gem-empty

https://github.com/rvm/gem-empty

添加命令 gem empty 从当前 GEM_HOME 中删除所有 gem。

gem-ctags

https://github.com/tpope/gem-ctags

添加一个 gem ctags 命令来调用 Exuberant Ctags 索引器在已安装的 gem 上,然后在安装 gem 时自动调用它。

gem_info

https://github.com/oggy/gem_info

添加一个 gem info 命令,对名称和版本进行模糊匹配。专为脚本使用而设计。

gem-init

https://github.com/mwhuss/gem-init

添加 gem init 来创建一个简单的 gem。

gem-compare

https://github.com/fedora-ruby/gem-compare

添加 gem compare 命令,可以帮助您通过比较 gemspec 值、gemspec 和 Gemfile 依赖项以及文件来跟踪发布的 .gem 文件中的上游更改。

gem-man

https://github.com/defunkt/gem-man

gem man 命令允许您查看 gem 的手册页。

gem-nice-install

https://github.com/voxik/gem-nice-install

尝试使用标准 gem install 命令安装安装带有二进制扩展的 gem 所需的系统依赖项。目前仅适用于 Fedora,但希望能够扩展。

gem-orphan

https://github.com/sakuro/gem-orphan

添加一个 gem orphan 命令,用于查找和列出没有其他 gem 依赖的 gem。

gem-patch

https://github.com/strzibny/gem-patch

添加 gem patch 命令,使您能够直接在 .gem 文件上应用补丁。支持 RubyGems 1.8 和 RubyGems 2.0。

gem-toolbox

https://github.com/gudleik/gem-toolbox

添加六个命令

  • gem open - 在您的默认编辑器中打开一个 gem
  • gem cd - 将您的工作目录更改为 gem 的源代码根目录
  • gem readme - 查找并显示 gem 的自述文件
  • gem history - 查找并显示 gem 的变更日志
  • gem doc - 在默认浏览器中浏览 gem 的文档
  • gem visit - 在默认浏览器中打开 gem 的主页

gem-wrappers

https://github.com/rvm/gem-wrappers

创建 gem 包装器,以便在 cron 和其他系统位置轻松使用 gem。默认情况下,在安装 gem 时会安装包装器。

添加以下命令:

  • gem wrappers regenerate - 强制重建所有 gem 可执行文件的包装器
  • gem wrappers - 显示当前配置

graph

https://github.com/seattlerb/graph

添加 gem graph 命令,以 graphviz 的 dot 格式输出 gem 依赖关系图。

maven_gem

https://github.com/jruby/maven_gem

添加 gem maven 命令,以安装任何 Maven 发布的 Java 库,就像它是 gem 一样。

manpages

https://github.com/bitboxer/manpages

将 gem 中的 man 手册暴露给 man 命令,无需调用 gem man 或其他命令来读取 gem 的 man 手册。

open_gem

https://github.com/adamsanderson/open_gem

添加两个命令:

  • gem open 在默认编辑器中打开 gem
  • gem read 在默认浏览器中打开 gem 的 rdoc

push_safety

https://github.com/jdleesmiller/push_safety

将白名单应用于 gem push,以防止意外将私有 gem 推送到公共 RubyGems 存储库。

rbenv-gem-rehash

https://github.com/sstephenson/rbenv-gem-rehash

在安装或卸载 gem 后自动运行 rbenv rehash

此插件已弃用,因为其行为现在已包含在 rbenv 核心代码中。

rubygems-desc

https://github.com/chad/rubygems-desc

添加 gem desc 命令,以按名称描述 gem。

rubygems-openpgp

https://github.com/grant-olson/rubygems-openpgp

添加命令和标志,以允许对 gem 进行 OpenPGP 签名。

  • gem sign foo.gem 用于对 gem 进行签名。
  • gem verify foo.gem --trust 用于验证 gem。
  • gem build foo.gemspec --sign 用于在构建时进行签名。
  • gem install foo --verify --trust 用于在安装时进行验证。

rubygems-sandbox

https://github.com/seattlerb/rubygems-sandbox

使用 gem sandbox 命令管理命令行 gem 工具和依赖项。这使您可以将 flay 和 rdoc 等工具安装在全局 rubygems 存储库之外。

rubygems_snapshot

https://github.com/rogerleite/rubygems_snapshot

添加 gem snapshot 命令,用于将当前所有 gem 导出到单个文件中,以便以后导入。

特定安装

https://github.com/rdp/specific_install

允许您直接从 GitHub 存储库安装“边缘”gem,或从任意 Web URI 安装 gem。

rubygems-tasks

https://github.com/postmodern/rubygems-tasks

rubygems-tasks 提供了用于构建、安装和发布 Ruby Gems 的通用且不显眼的 Rake 任务。

rubygems_plugin_generator

https://github.com/brianstorti/rubygems_plugin_generator

rubygems_plugin_generator 是一个用于生成插件的插件。只需运行 gem plugin <name> 即可。