插件
使用 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 commands
,gem help graph
…)。
现有插件
以下 RubyGems 插件列表可能并不完整。如果您知道我们错过的插件,请随时更新此页面。
- executable-hooks
- gem-browse
- gem-ctags
- gem-empty
- gem_info
- gem-init
- gem-compare
- gem-man
- gem-nice-install
- gem-orphan
- gem-patch
- gem-toolbox
- gem-wrappers
- graph
- maven_gem
- manpages
- open_gem
- push_safety
- rbenv-gem-rehash
- rubygems-desc
- rubygems-openpgp
- rubygems-sandbox
- rubygems_snapshot
- 特定安装
- rubygems-tasks
- rubygems_plugin_generator
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
在您的编辑器中打开一个 gemgem open
在您的编辑器中按名称打开一个 gemgem clone
从 GitHub 克隆一个 gemgem 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
- 在您的默认编辑器中打开一个 gemgem 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
在默认编辑器中打开 gemgem 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>
即可。