如何在ruby gems中添加(pre/post)_install_hook

Nik*_*her 6 ruby gem hook

我想在安装时使用rubygems.org安装一个带有类似命令的gem来执行一些代码gem install some-gem.

该文档声明您可以使用http://docs.ruby-lang.org/en/2.2.0/Gem.html pre_install挂钩,如下所示:

# File lib/rubygems.rb, line 724
def self.pre_install(&hook)
  @pre_install_hooks << hook
end
Run Code Online (Sandbox Code Playgroud)

该文件进一步指出:

RubyGems默认值存储在rubygems/defaults.rb中.如果您正在打包RubyGems或实现Ruby,您可以更改RubyGems的默认值.对于RubyGems打包器,提供lib/ruby​​gems/defaults/operating_system.rb并覆盖lib/ruby​​gems/defaults.rb中的任何缺省值.对于Ruby实现者,提供lib/ruby​​gems/defaults /#{RUBY_ENGINE} .rb并覆盖lib/ruby​​gems/defaults.rb中的任何缺省值.如果您需要RubyGems 来执行安装或卸载的额外工作,则默认覆盖文件可以设置安装前和安装后的挂钩.请参阅:: pre_install,:: pre_uninstall,:: post_install,:: post_uninstall.

这听起来正是我想要的.所以我创建了文件

  • LIB /的rubygems /默认/ defaults.rb
  • LIB /的rubygems /默认/ operating_system.rb
  • RubyGems的/ defaults.rb

我把代码

Gem.pre_install { puts 'pre install hook called!' }
Run Code Online (Sandbox Code Playgroud)

在所有列出的文件中.然后我将它们添加到gemspec中的require_paths,如下所示:

s.require_paths = ["lib", "test", "rubygems"]
Run Code Online (Sandbox Code Playgroud)

但是在安装gem时终端没有看到输出.

我究竟做错了什么?

Jam*_*rne 2

目前的答案是(2015-11-11)不,您不能在安装时为特定的 gem执行任意代码。您的问题中提到的钩子供 RubyGem 安装程序本身使用,而不是特定于 gem 的。请参阅:如何使 Ruby gem 包将文件复制到任意位置?了解更多详情。

这些文件:

lib/rubygems/defaults/defaults.rb
lib/rubygems/defaults/operating_system.rb
rubygems/defaults.rb
Run Code Online (Sandbox Code Playgroud)

不会从您的 gem 目录中调用。它们可以在 RubyGems 系统位置找到。

如果您希望在安装任何 gem 之前对每个 gem 执行相同的代码,那么您可以通过将代码放置/usr/lib64/ruby/2.2.0/rubygems/defaults.rb在系统上安装了您的 Ruby 版本的位置来使用 pre_install 挂钩。该operating_system.rb文件也将从同一位置加载。