我编写了一个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可以使用这个公共代码?我是否完全以错误的方式重用?符号链接魔术?
感谢您花时间阅读此内容。
答案 0 :(得分:2)
总结以上对后代的评论......
这里有几件事需要考虑。
1. commonCode
是否重要?它是一大堆代码,还是只是几个文件?
2. gemA
和gemB
是否显着?他们每个人真的应该是宝石吗?
看起来你处于两种情况中的任何一种情况,这取决于你所写代码的重要性:
commonCode
足够重要(代码量,复杂性,与gemA
和gemB
的逻辑分离)值得拥有自己的宝石?如果是这样,一定要把它拉到自己的宝石中。您可以在其他两个中要求gem-common
。要求A
和B
中的纯红宝石文件存在于这两个代码库之外是没有意义的。
commonCode
太过无足轻重了,无法进入自己的宝石。如果是这种情况,您应该考虑gemA
和gemB
是否真的值得拥有自己的宝石。如果它们不够大或在逻辑上足够分离,那么这三个可能会组合成一个更大的宝石。