如何将Ruby gem包复制到任意位置?

时间:2008-12-15 03:03:22

标签: ruby rubygems gem

假设您有一个软件包。你想让它成为一个宝石,因为宝石是在Ruby世界中分发任何东西的事实上的标准方式。宝石很棒 - 对于图书馆来说。但对于实际应用程序,Rubygems系统似乎缺乏。只有“最近”他们引入了一种方法来标记可执行文件放置在系统范围的可执行PATH中的某个位置。不幸的是,Ruby gems似乎仍然需要软件打包的其他方面,即将配置文件放在/ etc等文件中,或者放在/ usr / share / doc下的文档中。或者是吗?我的问题是:

我可以在gemspec中放置指令或代码以将配置安装到/ etc中,并在一些合理的标准化位置(例如/ usr / share / doc)下放置文档吗?或者,作为一种解决方法,可以运行安装后脚本来执行这些操作吗?

供参考:the GemSpec specification

请注意,在撰写本文时,rubygems.org已关闭。以下是该页面的Google缓存:http://74.125.95.132/search?q=cache:JwJO6slR4BwJ:www.rubygems.org/read/chapter/20+http://www.rubygems.org/read/chapter/20%23page85&hl=en&ct=clnk&cd=1

如果您检查the specification.rb file in the repo,向下滚动到末尾(搜索“:section:Required gemspec attributes”),您可以看到当前支持的属性。我看不到任何看起来像我想要的东西。

3 个答案:

答案 0 :(得分:1)

答案简短:没有

答案很长:你不应该/需要这样做... gems被设计用作库...而不是作为应用程序自己(调查你的发行版应用程序包系统的那种类型的东西)。另外,你不能假设你的宝石只会被“使用一次”...理论上,几个项目/应用程序可能包含你的宝石,虽然你的宝石可能有一些细节可以排除它可以全局配置...您仍然不希望这样做,因为其他架构问题,例如开发/配置您的应用程序以在不同的阶段环境(开发/测试/阶段/生产)中工作。最后一个最好的情况就是注意如何在README中创建/ etc / config文件,并包含一个实用程序应用程序来提示用户输入值。

答案 1 :(得分:1)

  

你不应该/需要这样做... gems被设计用作库...而不是作为应用程序自己(调查你的发行版应用程序包系统的那种类型)。

你知道的。而且我知道。但“他们”并不知道。对于许多卫星,常规查询和评论是:“有宝石吗?” “这可以作为宝石安装吗?” “你为什么不做宝石?” “我没有安装它,因为它不是宝石。”

对与否,可取与否,Joe Rubyist希望所有内容都能被诠释。只有老学生熟悉并且似乎容忍“ruby setup.rb”类型的交易。

无论如何,我的应用程序确实是一个独立的应用程序;我很难想象有人像这样的图书馆。也许作为一系列应用程序的一部分,但......作为一个库的使用似乎相当牵强,但如果那一天应该到来,我会越过那个桥梁(帮助有冲突的人)包容可能会带来。)

并没有“dev / test / stage / prod”的区别。这是一个普通的旧应用程序,你可以从命令行运行它。

无论如何,感谢您的评论,至少我的假设得到肯定,因为Rubygems系统没有提供这样做的方法。

答案 2 :(得分:1)

2015年11月11日 下面是这种情况:RubyGems支持安装前/后安装挂钩作为gem命令的扩展。换句话说,这些钩子适用于所有已安装的宝石,并不打算在特定宝石中进行自定义。它们在operating_system.rb中通常可以找到的名为/usr/lib64/ruby/2.2.0/rubygems的文件中调用;或者安装Ruby的位置和版本。因此使用钩子:

# /usr/lib/ruby/x.y.z./rubygems/operating_system.rb
Gem.pre_install do | installer |
  # do whatever
end

Gem.pre_uninstall do | installer |
  # do whatever
end

Gem.post_install do | installer |
  # do whatever
end
. . .

更深入地了解API文档,看来如果采用特定于gem的外部活动,可以使用插件。请参阅:http://guides.rubygems.org/plugins/#executablehookshttps://github.com/rvm/executable-hooks作为示例。但是,这些似乎一般都会影响RubyGem应用程序而不是特定的一个gem。这样的插件需要作为宝石本身安装才能生效。

在我看来,特定于宝石的安装前和安装后挂钩是一个安全问题。安装系统级Gem的人根据定义拥有root权限,并允许RubyGem在简单安装库之外执行任意操作具有明显的安全隐患。

我正在检查这方面的Ruby人(2015-11-10)。可能这些钩子仅供在不同平台上安装RubyGem的人使用。

RubyGems now(2015)支持pre_install()post_install()挂钩作为将&块作为参数的方法。据推测,你可以在其中任何一个中做任何你想要的事情,只要你不从任何一个返回false。返回nil即可,但false返回将中止gem安装。