Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以让rubygems忽略gem版本冲突吗?_Ruby_Rubygems_Dependencies - Fatal编程技术网

我可以让rubygems忽略gem版本冲突吗?

我可以让rubygems忽略gem版本冲突吗?,ruby,rubygems,dependencies,Ruby,Rubygems,Dependencies,我已经对rubygems代码进行了一些挖掘,它看起来没有一种内置的方法可以让它不抛出Gem::ConflictError,即使有。在开发过程中,我可能想测试一些我知道不会涉及冲突源代码的东西,或者我知道以前冲突gem的任何版本都不会导致问题。我只想继续测试我想测试的东西,我会担心版本冲突 我知道我可以用rubygems来做这件事。我可以想一个或多个方法来完成它。我只是有点好奇是否有人已经这样做了,他们是如何做到的,也许代码已经在某处共享了。我也有点好奇为什么rubygems没有内置这一开发工具。

我已经对rubygems代码进行了一些挖掘,它看起来没有一种内置的方法可以让它不抛出
Gem::ConflictError
,即使有。在开发过程中,我可能想测试一些我知道不会涉及冲突源代码的东西,或者我知道以前冲突gem的任何版本都不会导致问题。我只想继续测试我想测试的东西,我会担心版本冲突


我知道我可以用rubygems来做这件事。我可以想一个或多个方法来完成它。我只是有点好奇是否有人已经这样做了,他们是如何做到的,也许代码已经在某处共享了。我也有点好奇为什么rubygems没有内置这一开发工具。

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

如果您试图进行测试,并且希望避免解决冲突,只需暂时从
gem文件中删除该
gem
要求


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

如果你真的知道你在做什么,试试以下方法:

export NOEXEC\u DISABLE=1
ruby you-program.rb

此环境变量将禁用gem文件和gem版本的搜索和检查。

同意。在编写大量基于错误假设的代码之前,最好先确定冲突在哪里,这会将事情锁定在适当的位置,使回溯更加困难。完全可以加载多个版本的代码。rubygems试图管理的事实是辅助的,而不是Ruby固有的。在某些情况下,这也许是不可取的,但一点也不难做到。我试图暗示,最终,是的,冲突需要解决(因此出现了“开发期间……”)。问题是,有时候你脑子里有一些事情你现在就想处理,而不得不忘记所有这些,解决一个你知道现在不会发生的冲突,这只会适得其反。所以,我不同意。首先,理论上可以做到并不意味着实际上可以做到。正确编码的gem可能会在重命名后继续存在。许多人不会这样做,因为他们认为自己可以控制指定的命名空间。如果同时加载一个gem的两个不同版本,您将遇到冲突,并且可能会变得混乱,因为与Ruby-core捆绑的YAML解析器与gem版本之间的不断摩擦一次又一次地显示出来。在Ruby世界中,这是一个非常棘手的问题。如果你想完成一些事情,这是完全可以理解的,那么就开始禁用依赖项并做你必须做的事情。如果你能想出一个优雅的解决方案来侧面加载RubyGem的替代版本,也许可以使用新的“改进”功能,我相信其他人会对你是如何做到的感兴趣。我从未见过一个好的通用解决方案。每次我不得不这样做的时候,我都会把gem分叉,重新命名,并在重新加载之前对它进行彻底的测试。我们(每天)都会加载并运行代码,这些代码可以替代给定gems中的代码。这根本不是什么挑战。忽略依赖关系是一项挑战。加载替代代码的一种方法是将代码的所需路径取消移动到加载路径上。你可以做的另一件事是进入gems目录,用一个符号链接替换gem,该符号链接指向正在进行的代码。我们通常选择前者,但后者有时是必要的(例如,当我们正在为第三方软件开发JRuby插件时)。可能会对您有所帮助,为gem文件中的每个gem使用
require:false
参数。有点笨手笨脚……但我喜欢它!下次有需要的时候我会试试的。