2016-07-06 51 views
1

我已经做了一些挖掘rubygems的代码,它看起来并不像是有一种内置的方法,即使它有一个也不会抛出Gem::ConflictError。在开发过程中,我可能想要测试一些我知道不会触及冲突即将发生的代码的东西,或者我知道任何冲突的gem版本都不会导致问题。我只想继续测试我想测试的内容,稍后我会担心版本冲突。我可以让rubygems忽略宝石版本冲突吗?

我知道我可以破解rubygems来做到这一点。我可以考虑或多种方式来完成它。我只是有点好奇,如果有人已经这样做,他们是如何做到的,也许如果该代码已被分享到某个地方。我也有点好奇,为什么这不是作为开发工具内置于rubygems的。

+0

也许[this](http://stackoverflow.com/questions/16741935/how-to-tell-bundler-to-ignore-gems-that-dont-exist#16742178)帮助你,使用'require: Gemfile中每个gem的false参数。 – AxelWass

回答

2

在完成任何事情之前,您现在需要担心版本冲突。由于Ruby具有单独的根名称空间,并且每个依赖项都被加载,所以通常不可能加载相同gem的多个版本。像Node.js的NPM等其他系统更加灵活,可以同时加载任意数量的版本,因此如果习惯了这种情况,则需要调整您的期望。

如果您正在尝试进行测试,并且想要避免解决冲突,请暂时从Gemfile中删除gem要求。

最终你必须解决问题,这是没有办法的,但你总是可以选择你需要的东西。

+1

同意。最好先确定冲突的起始位置,然后根据错误的假设编写大量代码,将事情锁定到位并使其更难以回溯。 –

+0

加载多个版本的代码是完全可能的。 rubygems试图管理这个事实是辅助的,而不是Ruby固有的。在某些情况下,这可能是不可取的,但一点也不难。我试图暗示,最终,是的,冲突需要解决(因此“发展中......”)。重点在于,有时候你有一些想要处理**的东西,并且必须忘记所有这些,并且解决**你不知道的冲突**现在**只是适得其反。所以,我不同意这里。 – Huliax

+0

首先,仅仅因为它可以被理论化*并不意味着它实际上是可行的。一个正确编码的宝石可能会被重新命名。许多人不会因为他们认为他们可以控制他们指定的命名空间。如果同时加载两个不同版本的gem,则会产生冲突,并且随着与Ruby核心绑定的YAML解析器与gem版本反复显示的不断摩擦,它可能会变得混乱。这是Ruby世界中一个超级棘手的问题。 – tadman

0

如果你真的知道自己在做什么,试试这个:

export NOEXEC_DISABLE=1 
ruby you-program.rb 

这个环境变量将禁用搜索和检查Gemfiles和宝石版本。

+0

有点霸道......但我喜欢它!下次我需要时我会尝试一下。 – Huliax