我想在安装时使用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/rubygems/defaults/operating_system.rb并覆盖lib/rubygems/defaults.rb中的任何缺省值.对于Ruby实现者,提供lib/rubygems/defaults /#{RUBY_ENGINE} .rb并覆盖lib/rubygems/defaults.rb中的任何缺省值.如果您需要RubyGems 来执行安装或卸载的额外工作,则默认覆盖文件可以设置安装前和安装后的挂钩.请参阅:: pre_install,:: pre_uninstall,:: post_install,:: post_uninstall.
这听起来正是我想要的.所以我创建了文件
我把代码
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时终端没有看到输出.
我究竟做错了什么?
目前的答案是(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文件也将从同一位置加载。
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |