2014-04-09 48 views
0

我写了一个Ruby模块,common_services.rb,它包含了与Web服务接口的便捷方法;我认为这是一个共同的代码。现在,我想创建两个独立的宝石,这两个宝石在这个模块中都使用了便利的方法。我想象这样的事情:如何让多个宝石共享相同的Ruby模块?

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的..符号,并试图安装所产生的宝石,生产:

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中,我应该如何以及在哪里组织Ruby代码,这些代码将被我的代码行中的多个gem使用,以便多个gem可以使用此通用代码?我是否完全用错误的方式去重用?符号链接魔法?

感谢您花时间阅读本文。

+4

好像你需要3颗宝石。将common_code拉出它自己的宝石,并让其他两个拉入其中。对于我来说,要求一个生活在宝石之外的普通ruby文件并没有什么意义。 – CHK

+0

我曾考虑过这个问题,但我不确定:除了提供其他宝石的服务之外,独立的Ruby gem是否很常见?我用过的大多数宝石*都做了某些事情*。但我同意,这是一种优秀的通用代码组织模式,就像我上面提到的那样。 – Jeffro

+0

我认为这一切都取决于每一位代码的重要性。 'common_code'对于它自己的宝石是否足够重要?或者更重要的是,gemA和gemB真的不同以至于有可能拥有自己的宝石? Perhap包含所有三个单宝石是更好的? – CHK

回答

2

总结上述评论为后人...

这里有几件事情要考虑。 1.是commonCode有意义吗?它是一个很好的代码块,还是仅仅几个文件? 2.是gemAgemB有意义吗?他们应该每个人真的是宝石?

好像你在以下两种情形之一的,根据代码的意义你写的是:

  1. commonCode足够显著(代码,复杂性,逻辑分离从gemA量和gemB)值得自己的宝石?如果是这样,一定要把它拉进自己的宝石。其他两个可以要求gem-common。要求在这两个代码库之外的AB中存在一个普通的ruby文件是没有意义的。

  2. commonCode太微不足道了,无法拉进自己的宝石。如果是这样,你应该考虑gemAgemB是否真的值得自己的宝石,每个。如果它们不够大或逻辑上不够分离,也许这三者可以合并成一个更大的宝石。

相关问题