2008-12-15 22 views
3

假设你有一个软件包。你想让它成为宝石,因为宝石是在Ruby世界中分配任何事物的事实上的标准方式。宝石非常棒 - 对于图书馆来说。但对于真正的应用程序,Rubygems系统似乎缺乏。只有“最近”他们引入了一种将可执行​​文件标记为放置在全系统可执行文件路径中某处的方法。不幸的是,Ruby的宝石似乎仍然需要软件包的其他方面,即将配置文件放在/ etc或/ usr/share/doc下的文件中。或者是?我的问题是:如何将一个Ruby gem包复制到任意位置?

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

仅供参考:the GemSpec specification

请注意,rubygems.org在撰写本文时已关闭。下面是页面的谷歌的缓存: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,上下接近尾声滚动(搜索“:部分:必需gemspec属性”),你可以看到什么似乎是目前支持的属性。我看不到任何内容,看起来像我想要的。

+0

当它,SOF上的Markdown解析器被搞砸了......预览和实际的帖子不同。 :( – Pistos 2008-12-15 03:10:50

回答

1

简短的回答:没有

长的答案:你应该不希望/需要做到这一点...宝石设计用作图书馆...还不如在自己的应用程序(调查您的发行版该类型的应用程序包系统)。另外,你不能假定你的宝石只能用于“一次”...理论上几个项目/应用程序可能包括你的宝石,虽然可能有一些具体的宝石,排除它可能是全球配置的东西...由于其他架构问题,例如开发/配置应用程序以在不同阶段环境(dev/test/stage/production)中工作,您仍然不希望这样做。最好的情况下,你可能会注意到如何在自述文件中创建/ etc/config文件,并包含一个实用程序应用程序来提示用户输入值。

0

你不应该想/需要做到这一点...宝石设计用作图书馆...还不如在自己的应用程序(调查该类型的东西你的发行版的应用系统级封装)。

你知道的。我知道这一点。但是“他们”不知道这一点。对于很多卫星来说,定期的查询和评论是:“有没有宝石?” “这可以作为宝石安装吗?” “你为什么不做宝石?” “我没有安装它,因为它不是宝石。”

是否合适,Joe Rubyist希望所有东西都是宝石。只有老的学生熟悉并且似乎容忍“ruby setup.rb”类型的交易。

无论如何,我的应用程序确实是一个独立的应用程序;我几乎无法想象包括这个像图书馆这样的人。也许作为一个应用程序集合的一部分,但是...作为一个库的用法看起来很牵强,但如果这一天永远到来,我会在碰到它时跨过这个桥梁(帮助那些有冲突的人包容可能会带来)。

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

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

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文档,似乎聘请外部活动的具体的宝石有一个可用的插件。例如:http://guides.rubygems.org/plugins/#executablehookshttps://github.com/rvm/executable-hooks。但是,这些都似乎通常影响RubyGem应用程序,而不是专门影响一个gem。而这些插件需要安装成宝石本身才能起作用。

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

我正在与Ruby人讨论此事(2015-11-10)。这可能是因为这些钩子仅适用于在不同平台上安装RubyGem的人员。

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

相关问题