如何拥有多个共享相同的常见Ruby模块的gem?

时间:2014-04-09 19:00:16

标签: ruby module gem

我编写了一个Ruby模块common_services.rb,其中包含与Web服务连接的便捷方法;我认为这是一个通用代码。现在,我想创建两个独立的宝石,这两个宝石都使用了这个模块中的便捷方法。我想象出这样的事情:

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中是否有更好的方法可以做到这一点。我遇到的一个问题是打包宝石以引用在其自己的路径之外的文件

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

对我来说,为什么宝石不被允许到达他们自己的路径之外是有道理的,但我不知道如何解决这个问题。在Ruby中,我应该如何以及在何处组织将在我的代码行中由多个gem使用的Ruby代码,以便多个gem可以使用这个公共代码?我是否完全以错误的方式重用?符号链接魔术?

感谢您花时间阅读此内容。

1 个答案:

答案 0 :(得分:2)

总结以上对后代的评论......

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

看起来你处于两种情况中的任何一种情况,这取决于你所写代码的重要性:

  1. commonCode足够重要(代码量,复杂性,与gemAgemB的逻辑分离)值得拥有自己的宝石?如果是这样,一定要把它拉到自己的宝石中。您可以在其他两个中要求gem-common。要求AB中的纯红宝石文件存在于这两个代码库之外是没有意义的。

  2. commonCode太过无足轻重了,无法进入自己的宝石。如果是这种情况,您应该考虑gemAgemB是否真的值得拥有自己的宝石。如果它们不够大或在逻辑上足够分离,那么这三个可能会组合成一个更大的宝石。