新手问题 如果两个 gem 的 module 名字冲突了该怎么消除呀?

miao · 2019年08月03日 · 最后由 huacnlee 回复于 2019年08月05日 · 2300 次阅读

假如两个 gem1,gem2,都有个 module A,module A 里都有个函数 foo,在一个文件里 require 这两个 gem,然后调用 A.foo 这个 foo 的定义是最后 require 的那个。怎么区分开啊?

那么至少有一个 gem 不遵守命名规范,舍弃它。

Rei 回复

命名规范是指?比如按域名一级一级的命名,就像 golang 的 package 一样,还是有其它方式。我观察别人写的 gems,命名就是起一个名字而已,通常就一个单词。

例如 gem a,里面有 module A,并且所有内容都在 A 的命名空间下。gem b 应该有 module B,并且把所有内容放在 module B。gem 的名字和命名空间是对应的,但这只是规范约束没有强约束。

例外的就是一类给其他 gem 打补丁或者扩展的 gem,会侵入原先的 gem 的命名空间,这时候需要打补丁的 gem 处理不要跟原 gem 冲突。

Rei 回复

我懂了,谢谢。但是有没有可能两个人写的 gem 起了一样的名字,导致都是 gem a,都有 module A,但功能不相关。当然如果都发布到一个网站比如 rubygems.org,是不会有一样名字的。 那么也就是说写 gem 要趁早,好名字被别人占了很麻烦。😂

miao 回复

是要抢名字。

你可以用其他的 Gem 名称,比如你 Module 本来期望是 Rails,那么可以增加前缀或后缀,然后 lib 文件夹提供一个和 Gem 名称一样的 .rb 文件,这样 RubyGems 就能自动 require 到了:

lib
  rails
  my-rails.rb
my-rails.gemspec
需要 登录 后方可回复, 如果你还没有账号请 注册新账号