Ruby Bundler-对于特定的gem,bundle包需要花费很长时间

Ruby Bundler-对于特定的gem,bundle包需要花费很长时间,ruby,performance,gem,bundler,Ruby,Performance,Gem,Bundler,在我工作的地方,我们开发了一些内部使用的红宝石。它们都依赖于我们自己的内部gems以及RubyGems.org上的第三方gems的各种组合 当我们使用构建服务器(ElectricCommander)进行更改时,我们会自动构建gems,该服务器将gems打包为gems并存储在内部存储库中。作为该过程的一部分,我们运行bundle包--all。直到上周,我们所有的宝石都在完美地工作 上周,我们的一个gem开始花1个多小时运行bundle-package命令。它运行成功,但只需要一个多小时就可以完成,

在我工作的地方,我们开发了一些内部使用的红宝石。它们都依赖于我们自己的内部gems以及RubyGems.org上的第三方gems的各种组合

当我们使用构建服务器(ElectricCommander)进行更改时,我们会自动构建gems,该服务器将gems打包为gems并存储在内部存储库中。作为该过程的一部分,我们运行
bundle包--all
。直到上周,我们所有的宝石都在完美地工作

上周,我们的一个gem开始花1个多小时运行bundle-package命令。它运行成功,但只需要一个多小时就可以完成,这有点荒谬

在我们的其他gem构建中,bundle-package命令在一分钟左右就可以正常运行。每个gem包含的依赖项的数量并没有很大的差异。它们都在相同的环境中构建


我们正在为这件事大惊小怪。谷歌搜索没有发现任何人有同样的问题。有没有人遇到过这个问题,或者有没有人知道是什么原因导致了这个问题?

我以前也遇到过类似的问题,当时正在讨论的gem依赖于另一个gem,而这两个gem都有许多版本,并且有许多其他依赖项。在我们的gem中,另一个gem(它是rails)作为依赖项,不依赖于特定的版本

所以我们有:

s.add_runtime_dependency "rails"
当我们添加一个版本时,我们看到捆绑速度显著提高:

s.add_runtime_dependency "rails", "~>3.2"
采用绝对严格的版本,速度更快:

s.add_runtime_dependency "rails", "3.2.14"

我认为,之所以速度缓慢,是因为它会查看与gempec中的依赖项匹配的gem所有版本的所有依赖项。正如您可以想象的那样,对于一个已经存在了一段时间并且本身有许多其他依赖项的gem来说,这可能是一个非常重要的问题。

我以前也遇到过类似的问题,当所讨论的gem依赖于另一个gem时,它既有许多版本,也有许多其他依赖项。在我们的gem中,另一个gem(它是rails)作为依赖项,不依赖于特定的版本

所以我们有:

s.add_runtime_dependency "rails"
当我们添加一个版本时,我们看到捆绑速度显著提高:

s.add_runtime_dependency "rails", "~>3.2"
采用绝对严格的版本,速度更快:

s.add_runtime_dependency "rails", "3.2.14"

我认为,之所以速度缓慢,是因为它会查看与gempec中的依赖项匹配的gem所有版本的所有依赖项。正如您可以想象的那样,对于一个已经存在了一段时间并且本身具有许多其他依赖项的gem,这可能需要大量的查找。

Bundler非常努力地寻找一组满足您的bundle所有要求的gem,但在某些情况下,此搜索可能需要很长时间。根据gem文件中gem的顺序、您提供的约束以及在其他gem中遇到的依赖关系,Bundler可能需要回溯解析过程并重新解析某些gem。在最坏的情况下,这可能需要指数级的时间

帕特·肖内西在书中很好地解释了这个过程。正如他提到的,在环境中运行Bundler with
DEBUG\u RESOLVER=1
可以帮助您了解发生了什么


您可以通过更改Gem文件中Gem的顺序或使用Shadwell建议的更具体的版本约束来解决这些问题。

Bundler非常努力地找到一组满足所有捆绑包要求的Gem,但在某些情况下,此搜索可能需要很长时间。根据gem文件中gem的顺序、您提供的约束以及在其他gem中遇到的依赖关系,Bundler可能需要回溯解析过程并重新解析某些gem。在最坏的情况下,这可能需要指数级的时间

帕特·肖内西在书中很好地解释了这个过程。正如他提到的,在环境中运行Bundler with
DEBUG\u RESOLVER=1
可以帮助您了解发生了什么


您可以通过更改Gem文件中Gem的顺序或使用Shadwell建议的更具体的版本约束来解决这些问题。

谢谢,这解决了问题!该gem没有请求特定的版本,当我需要某些版本时,包包包时间从一个多小时下降到58秒。非常感谢!谢谢,这解决了问题!该gem没有请求特定的版本,当我需要某些版本时,包包包时间从一个多小时下降到58秒。非常感谢+1、感谢您在回答中链接的精彩文章!这对更好地理解Bundler非常有帮助。+1,感谢您在回答中链接的精彩文章!这有助于更好地理解Bundler。