Gem Gem 命名的 bug

camel · 2012年07月18日 · 最后由 camel 回复于 2012年07月19日 · 2960 次阅读

如果项目依赖一个叫"god-like"的 gem,那么 Rails 运行时就会自动生成一个GodLike的 module。

但如果你依赖一个叫'journey'的 gem,同时又有一个 model 叫‘Journey',那就悲剧了。 因为当在程序中调用’Journey'时,得到的是 gem 生成的Journey:module,却得不到 model,所有 ActiveRecord 相关的操作都会失败。

不知大家有没有处理这个问题的好方法?

ps:昨晚 @simsicon 的分享很精彩,这个问题应该是和$LOAD_PATH 相关的。

这个问题和 LOAD PATH 没关系。和命名空间有关啊。这东西一般生产环境会有常量重定义的 warning,开发环境可能因为 lazy loading 的问题不会有 warning,但是会发生各种错误。

解决方法就是: 1.把你的 model 名改了 2.把 gem 的命名空间更改了,这个要注意顺序,还有注意其他 gem 对这个命名空间的依赖。

至少要了解用到的 gem 吧,引入一个 kaminari 那么肯定不会再命名一个 Kaminari。

#1 楼 @hooopo Thx

1 改 model 名字不现实。 2 这个自动生成的 module 名和命名空间没关,只和 gem 名字有关,具体说是把 gem 名camelcase后的结果,测试后才发现的。

生成的 module 会把同名的 model 覆盖,所以我想如果在$LOAD_PATH中降低 gem 的优先级,会不会达到效果。 当然如果不生成这个 module 最好,一般无用。

#2 楼 @Rei 有些 gem 的命名实在是。。。乱。 而且有时觉得好的 model 名就那么几个。

#4 楼 @camel 看来写 gem 还是弄些奇怪名字好~

#3 楼 @camel 自动生成?不会啊,每个 Gem 都会把代码放在自己的 module 里面,这个 module 约定就是 gem 名驼峰化。

#6 楼 @Rei 这是一个约定。 但想 hack 下这个约定。 我知道的强制约定是:如果一个 gem 叫god_like,那么一定会有一个文件叫lib/god_like.rb。 至于god_like.rb里代码怎么写,是没有强制的。所以 gem 里的 module 名字可以自己取,甚至与 gem 名没有任何关系。

整体来说,Gem 的命名都还好吧,也不是很乱(乱的 gem 火不起来,那些 Github 上面关注少的 gem 就不要用了,除非你了解里面的情况)

#7 楼 @camel 不遵循的不用

#3 楼 @camel 你还是没有看到问题的本质啊。。 本质就是 module 名常量冲突。

给你一个简单解决办法,把自己的 model 都加上 namespace,然后在冲突的地方加 namespace 调用。 比如你的例子:

::Journey -> gem
My::Journey -> your model

#10 楼 @hooopo 虎泡 v5, 给自己的 model 或生成的 module 加 namespace 都可以解决,我更倾向于给后者加。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号