【问题标题】:How to have multiple gems that share the same common Ruby module?如何让多个 gem 共享相同的通用 Ruby 模块?
【发布时间】:2014-05-23 04:37:44
【问题描述】:

我编写了一个 Ruby 模块,common_services.rb,其中包含与 Web 服务交互的便捷方法;我认为它是一段通用代码。现在,我想创建两个单独的 gem,它们都利用了这个模块中的便捷方法。我想象这样的事情:

rubyStuff/
  commonCode/
    common_services.rb  <-- common code lives here
  gemA/
    bin/
    lib/                <-- gemA would like to pull in common_services to use it
    gemA.gemspec
  gemB/
    bin/
    lib/                <-- gemB would also like to pull in common_services to use it
    gemB.gemspec

每个 gemA 和 gemB 都会引用公共代码以便使用它,例如 rubyStuff/gemA/lib/gemA/main.rb 可能开头为:

require_relative '../../commonCode/common_services.rb'

puts CommonServices.getMessageOfTheDay()
<etc>

对我来说效果不太好,所以我想知道在 Ruby 中是否有更好的方法来做到这一点。我遇到的一个问题是打包一个 gem 以引用一个 在它自己的路径之外的文件

s.files = Dir['bin/**'] + Dir['lib/**/*'] + Dir['../commonCode/**'] 

在 gemspec 中使用 .. 表示法并尝试安装生成的 gem 时,会产生:

ERROR:  While executing gem ... (Gem::Package::PathError) installing into parent path /Users/me/.rvm/gems/ruby-2.0.0-p247/gems/commonCode/common_services.rb of /Users/me/.rvm/gems/ruby-2.0.0-p247/gems/gemA-0.0.1 is not allowed

对我来说,为什么不允许 gem 超出它们自己的路径是有道理的,但我不确定如何解决这个问题。在 Ruby 中,我应该如何以及在哪里组织将由我的代码行中的多个 gem 使用的 Ruby 代码,以便多个 gem 可以使用这个公共代码?我要以完全错误的方式重用吗?符号链接魔术?

感谢您花时间阅读本文。

【问题讨论】:

  • 看来你需要 3 颗宝石。将 common_code 拉出到它自己的 gem 中,并让其他两个中的每一个都将其拉入。对我来说,硬需要一个位于 gem 之外的普通 ruby​​ 文件真的没有意义。
  • 我想过,但我不确定:除了为其他 gem 提供服务之外,拥有一个独立的 Ruby gem 是否很常见?我用过的大多数宝石做某事。但我同意,对于我上面的通用代码来说,这是一种优越的组织模式。
  • 我认为这完全取决于每一位代码的重要性。 common_code 对于它自己的宝石来说真的足够重要吗?或者更重要的是,也许 gemA 和 gemB 真的不同到足以值得拥有自己的宝石吗?也许包含所有三个的单个宝石更好?
  • 我明白了。是的,common_code 拥有自己的 gem 是完全合适的。我省略了细节以使这个问题保持简单,但通用代码实际上是一个函数库,用于与第 3 方供应商的 Web 服务 API 一起工作......所以它很好地分解为自己的“第 3 方供应商实用程序”一种宝石。感谢您的建议!

标签: ruby module gem


【解决方案1】:

为后代总结上面的cmets...

这里有几件事需要考虑。 1.commonCode重要吗?它是一大段代码,还是只有几个文件? 2. gemAgemB 重要吗?他们每个人真的应该是宝石吗?

您似乎处于两种情况之一,具体取决于您编写的代码的重要性:

  1. commonCode 足够重要(代码量、复杂性、与gemAgemB 的逻辑分离)值得拥有自己的宝石?如果是这样,请务必将其拉出到自己的宝石中。您可以在另外两个中要求gem-common。在 AB 中需要一个位于这两个代码库之外的普通 ruby​​ 文件是没有意义的。

  2. commonCode 太微不足道,无法被拉入自己的宝石中。如果是这种情况,您应该考虑gemAgemB 是否真的值得拥有自己的宝石。如果它们不够大或在逻辑上不够独立,也许这三个可以组合成一个更大的宝石。

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2015-08-22
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多