4

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

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

供参考:GemSpec 规范

请注意,在撰写本文时 ruby​​gems.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”),您可以看到当前支持的属性。我在那里看不到我想要的东西。

4

3 回答 3

1

您不应该/不需要这样做... gems 被设计为用作库...而不是作为应用程序本身(调查您的发行版应用程序包系统以获取该类型的东西)。

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

对与否,可取与否,Joe Rubyist 期望一切都被宝石化。只有老学生熟悉并且似乎可以容忍“ruby setup.rb”类型的交易。

无论如何,我的应用程序确实是一个独立的应用程序;我很难想象任何人都像图书馆一样包括这个。也许作为应用程序集合的一部分,但是......作为一个库的使用似乎很牵强,但如果那一天真的到来,我会在我到达时跨过那座桥(帮助有任何冲突的人包容可能会带来)。

并且没有“开发/测试/阶段/产品”的区别。这是一个普通的旧应用程序,您可以从命令行运行它。

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

于 2008-12-15T14:43:17.173 回答
1

简短的回答:没有

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

于 2008-12-15T10:00:35.687 回答
1

2015-11-11 情况如下:RubyGems 支持 pre 和 post install/uninstall 钩子作为gem命令的扩展。换句话说,这些钩子适用于所有已安装的 gem,并不意味着在特定 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 本身安装才能生效。

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

我正在与 Ruby 人员核实此问题(2015 年 11 月 10 日)。可能这些钩子仅供在不同平台上安装 RubyGem 本身的人使用。

RubyGems 现在(2015)支持pre_install()post_install()钩子作为以 &block 作为参数的方法。假设您不false从其中任何一个返回,您可以在其中任何一个中做任何您想做的事情。返回nil是可以的,但false返回将中止 gem 安装。

于 2015-11-09T17:48:58.597 回答