首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相互冲突的红宝石

相互冲突的红宝石
EN

Stack Overflow用户
提问于 2010-12-21 09:07:08
回答 4查看 2.2K关注 0票数 7

我需要在我的项目中使用两个gem,这两个gem都使用PDF名称空间: pdf-reader和htmldoc。

有没有办法让他们和好如初呢?我能想到的唯一方法就是重写我自己的htmldoc版本,给它一个不同的命名空间。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-21 16:35:48

这个问题可能没有完美的解决方案。如果你真的需要两个gem并排工作,我认为你最好的选择是派生其中的一个(或者可能两者都有),并使用你的派生。我是这样做的:

  • 如果两个gem都不在Github上,看看你是否能拿到源代码(从gem中抓取它是可能的,但找到真正的存储库可能会很有帮助,因为那里可能有其他没有包含在gem中的文件),并把它放在Github上的存储库中。确保otherwise.

  • Use的许可证允许这样做(如果它是常见的开源文件之一,它几乎肯定会允许这样做。

  • 确保在存储库的根目录下有一个.gemspec文件,下一步将不会使用gem Bundler来管理您的项目依赖项。而不是指定对已修改的库的依赖

宝石“the_gem”

像这样指定它:

gem 'the_gem',:git =>‘git://github.com/you/the_ge.git’

(但将存储库的URL更改为实际的URL)

  • 向您修改过的gem的维护者发送一封电子邮件,请他或她考虑在下一个版本中合并您的更改。

Bundler使得使用gem的替代版本变得非常容易,麻烦也很少。我经常派生gem,修复bug或添加特性,更改我的Gemfile以指向我的版本,然后要求维护者合并我的更改。如果发生这种情况,我只需将我的Gemfile改回只引用gem的官方版本即可。

另一种策略是,如果维护者不想合并您的更改,而您希望将您的版本分发给其他人,则将您的版本作为新gem推送到Rubygems,但在这种情况下,在gem名称前加上您的名字,或其他将gem标识为变体的字符串。

票数 2
EN

Stack Overflow用户

发布于 2010-12-21 12:05:05

基本上,你什么也做不了。在Ruby中,在顶级名称空间中使用独特的名称正是出于这个原因,这是一种很好的做法,您只是碰巧发现了两个违反这种做法的库。

您可以做的一件事是使用Kernel#load而不是Kernel#requireKernel#load接受一个可选的布尔参数,该参数将告诉它在匿名模块中计算文件的值。但是,请注意,这绝不是安全的:完全有可能显式地将内容放在顶级名称空间中(使用module ::PDF之类的东西),从而脱离匿名模块。

还要注意的是,这个应用程序接口真的很糟糕:load只返回truefalse,就像require一样。(实际上,因为load总是加载,所以它总是返回true。)没有办法真正到达匿名模块。基本上,您必须手动从ObjectSpace中抓取它。哦,当然,由于实际上没有引用匿名模块,它将被垃圾收集,所以您不仅必须在ObjectSpace的内部翻找模块,还必须与垃圾收集器竞争。

有时,我希望Ruby有一个合适的模块系统,比如Newspeak、Standard ML或Standard。

票数 5
EN

Stack Overflow用户

发布于 2010-12-21 09:52:42

我听说过一项新的功能,叫做改进。它的设计目的是避免两个不同的monkeypatches影响同一个类导致问题,但我会看看它是否可以帮助您解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4495512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档