如何让多个gem共享同一个公共Ruby模块?

如何让多个gem共享同一个公共Ruby模块?,ruby,module,gem,Ruby,Module,Gem,我已经编写了一个Ruby模块,common_services.rb,其中包含与web服务接口的方便方法;我认为这是一个共同的准则。现在,我想创建两个单独的gem,它们都使用本模块中的便利方法。我想象这样的事情: rubyStuff/ commonCode/ common_services.rb <-- common code lives here gemA/ bin/ lib/ <-- gemA would like t

我已经编写了一个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
这对我来说不是很好,所以我想知道是否有更好的方法在Ruby中实现这一点。我遇到的一个问题是将gem打包为引用其自身路径之外的文件:

当使用。。gempec中的符号,并尝试安装生成的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
这对我来说是有道理的,为什么宝石不能到达他们自己的路径之外,但我不知道如何解决这个问题。在Ruby中,我应该如何组织代码行中多个gem将使用的Ruby代码,以及在哪里组织这些代码,以便多个gem可以使用这些通用代码?我是不是完全错了?符号链接魔法


感谢您花时间通读此文。

为子孙后代总结上述评论

这里有两件事要考虑。 1.
commonCode
是否重要?这是一段很好的代码,还是仅仅几个文件? 2.
gemA
gemB
是否显著?它们真的应该是宝石吗

看起来您处于两种情况之一,这取决于您编写的代码的重要性:

  • commonCode
    是否足够重要(代码量、复杂性、与
    gemA
    gemB
    的逻辑分离)以值得拥有自己的gem?如果是这样,一定要把它拉到自己的宝石里去。您可以在其他两个选项中要求
    gem common
    。在
    a
    B
    中需要一个位于这两个代码基之外的普通ruby文件是没有意义的

  • commonCode
    太微不足道了,不足以成为它自己的宝石。如果是这样的话,你应该考虑<代码> GEMA < /COD>和<代码> GEMB是否真的值得拥有他们自己的宝石。如果它们不够大,或者逻辑上不够独立,那么这三者也许可以合并成一块更大的宝石


  • 看来你需要3颗宝石。将公共_代码拉到它自己的gem中,让其他两个都拉进去。对我来说,硬要求一个普通的ruby文件存在于gem之外是没有意义的。我想了想,但我不确定:一个独立的ruby gem除了为其他gem提供服务之外,自己什么都不做,这是常见的吗?我用过的大多数宝石都有作用。但我同意,对于普通代码来说,这是一种比我上面提到的更好的组织模式。我认为这完全取决于代码的每一位的重要性。对于它自己的gem来说,
    common\u code
    真的足够重要吗?或者更重要的是,也许,gemA和gemB真的不同到值得拥有自己的宝石吗?我明白了,也许一块宝石包含了这三个元素就更好了。是的,公共_代码拥有自己的gem是完全合适的。为了使这个问题简单,我省略了细节,但公共代码实际上是一个函数库,用于使用第三方供应商的web服务API。。。因此,它很好地脱离了自己的“第三方供应商UTIL”类型的创业板。谢谢你的建议!
    s.files = Dir['bin/**'] + Dir['lib/**/*'] + Dir['../commonCode/**'] 
    
    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