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

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

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

供参考: GemSpec规范 。

请注意,在撰写本文时,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

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

简短的回答:没有

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

2015-11-11情况如下:RubyGems支持安装前/后安装挂钩作为gem命令的扩展。 换句话说,这些挂钩适用于所有已安装的gem,并不适合在特定gem中进行自定义。 它们在一个名为operating_system.rb的文件中调用,该文件通常位于/usr/lib64/ruby/2.2.0/rubygems ; 或者安装Ruby的任何位置和版本。 因此使用钩子:

 # /usr/lib/ruby/xyz/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/#executablehooks和https://github.com/rvm/executable-hooks作为示例。 但是,这些似乎一般都会影响RubyGem应用程序而不是特定的一个gem。 这样的插件需要作为gem本身安装才能生效。

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

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

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

您不应该/需要这样做… Gems被设计用作库…而不是作为应用程序自己(调查您的发行版应用程序包系统的类型的东西)。

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

无论是否正确,Joe Rubyist都希望所有内容都能被创造出来。 只有老学生熟悉并且似乎容忍“ruby setup.rb”类型的交易。

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

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

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