到目前为止的故事:
我有一个名为"Term"的模型的rails应用程序.一切都很顺利,直到尝试安装Cucumber.跑步时
rake cucumber
Run Code Online (Sandbox Code Playgroud)
我明白了
Term is not a class (TypeError)
Run Code Online (Sandbox Code Playgroud)
这是因为Cucumber包含另一个gem,'term-ansicolor'(在控制台中执行漂亮的彩色文本输出),term-ansicolor定义了一个名为"Term"的模块.在包含Rails模型之前,Cucumber包括term-ansicolor,因此在加载"Term"模型时,"Term"已被定义为模块.顶级模块和类在Ruby中不能具有相同的名称,因此发生冲突.
我不想重命名模型,而是开始修补term-ansicolor gem.事实证明这比我想象的更难.我将Term模块名称更改为"ANSITerm",但我无法弄清楚如何让Cucumber加载我修改过的gem,我已将其放入RAILS_ROOT/vendor/gems/term-ansicolor.
有任何想法吗?我吠叫错了树吗?
我正在制作一个具有各种授权级别的论坛应用程序,其中一个是Monitor.我是通过扩展我的User类来做到这一点的,我计划用"-ship"类(例如管理员,作者,主持人等)对此进行微调.显然,Monitor类是ruby mixin的一部分.如何在没有冲突的情况下保留我的资源名称?
我正在构建一个加载用户提供的ruby代码的框架.它基本上是一个插件机制.我希望用户提供ruby代码,以便能够获得自己的宝石.我打算让"插件"包中包含一个包含宝石的供应商目录.
如何加载插件所需的宝石,而不会让它们与我的框架的宝石发生冲突?例如,如果我的框架使用treetop版本1.3.0,并且插件使用treetop 1.4.2我希望每个都使用他们指定的版本.
同样,有没有办法防止插件相互冲突?
我查看了gem_plugin,_why的沙盒和其他一些工具.但是我没有看到任何专门处理这种情况的库 - 我认为它之前已经完成了.
我还看了Bundler的内部,看看它如何管理gem版本.如果需要,我准备做一些非常复杂的事情.但我仍然不确定如何去做.
我对如何实现这一点也有很大的自由.所以,如果你认为我正在咆哮错误的树,请说出来.
谢谢你的建议.
侧面注意:在我写这篇文章时,我发现需要类似于Java servlet容器中的类加载器.WAR文件可以包含jar文件,Web应用程序的类加载器将优先于全局类路径上的jar.ruby中是否有任何方法可以分割ruby"classpath"(即load_path,require等)?