假如两个 gem1,gem2,都有个 module A,module A 里都有个函数 foo,在一个文件里 require 这两个 gem,然后调用 A.foo 这个 foo 的定义是最后 require 的那个。怎么区分开啊?
那么至少有一个 gem 不遵守命名规范,舍弃它。
命名规范是指?比如按域名一级一级的命名,就像 golang 的 package 一样,还是有其它方式。我观察别人写的 gems,命名就是起一个名字而已,通常就一个单词。
例如 gem a,里面有 module A,并且所有内容都在 A 的命名空间下。gem b 应该有 module B,并且把所有内容放在 module B。gem 的名字和命名空间是对应的,但这只是规范约束没有强约束。
例外的就是一类给其他 gem 打补丁或者扩展的 gem,会侵入原先的 gem 的命名空间,这时候需要打补丁的 gem 处理不要跟原 gem 冲突。
我懂了,谢谢。但是有没有可能两个人写的 gem 起了一样的名字,导致都是 gem a,都有 module A,但功能不相关。当然如果都发布到一个网站比如 rubygems.org,是不会有一样名字的。 那么也就是说写 gem 要趁早,好名字被别人占了很麻烦。
是要抢名字。
你可以用其他的 Gem 名称,比如你 Module 本来期望是 Rails,那么可以增加前缀或后缀,然后 lib 文件夹提供一个和 Gem 名称一样的 .rb 文件,这样 RubyGems 就能自动 require 到了:
Rails
.rb
lib rails my-rails.rb my-rails.gemspec