我写了一个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可以使用此通用代码?我是否完全用错误的方式去重用?符号链接魔法?
感谢您花时间阅读本文。
好像你需要3颗宝石。将common_code拉出它自己的宝石,并让其他两个拉入其中。对于我来说,要求一个生活在宝石之外的普通ruby文件并没有什么意义。 – CHK
我曾考虑过这个问题,但我不确定:除了提供其他宝石的服务之外,独立的Ruby gem是否很常见?我用过的大多数宝石*都做了某些事情*。但我同意,这是一种优秀的通用代码组织模式,就像我上面提到的那样。 – Jeffro
我认为这一切都取决于每一位代码的重要性。 'common_code'对于它自己的宝石是否足够重要?或者更重要的是,gemA和gemB真的不同以至于有可能拥有自己的宝石? Perhap包含所有三个单宝石是更好的? – CHK