【发布时间】:2014-05-23 04:37:44
【问题描述】:
我编写了一个 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
每个 gemA 和 gemB 都会引用公共代码以便使用它,例如 rubyStuff/gemA/lib/gemA/main.rb 可能开头为:
require_relative '../../commonCode/common_services.rb'
puts CommonServices.getMessageOfTheDay()
<etc>
对我来说效果不太好,所以我想知道在 Ruby 中是否有更好的方法来做到这一点。我遇到的一个问题是打包一个 gem 以引用一个 在它自己的路径之外的文件:
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
对我来说,为什么不允许 gem 超出它们自己的路径是有道理的,但我不确定如何解决这个问题。在 Ruby 中,我应该如何以及在哪里组织将由我的代码行中的多个 gem 使用的 Ruby 代码,以便多个 gem 可以使用这个公共代码?我要以完全错误的方式重用吗?符号链接魔术?
感谢您花时间阅读本文。
【问题讨论】:
-
看来你需要 3 颗宝石。将 common_code 拉出到它自己的 gem 中,并让其他两个中的每一个都将其拉入。对我来说,硬需要一个位于 gem 之外的普通 ruby 文件真的没有意义。
-
我想过,但我不确定:除了为其他 gem 提供服务之外,拥有一个独立的 Ruby gem 是否很常见?我用过的大多数宝石做某事。但我同意,对于我上面的通用代码来说,这是一种优越的组织模式。
-
我认为这完全取决于每一位代码的重要性。
common_code对于它自己的宝石来说真的足够重要吗?或者更重要的是,也许 gemA 和 gemB 真的不同到足以值得拥有自己的宝石吗?也许包含所有三个的单个宝石更好? -
我明白了。是的,common_code 拥有自己的 gem 是完全合适的。我省略了细节以使这个问题保持简单,但通用代码实际上是一个函数库,用于与第 3 方供应商的 Web 服务 API 一起工作......所以它很好地分解为自己的“第 3 方供应商实用程序”一种宝石。感谢您的建议!