管理冲突的ruby gems版本[英] Managing conflicting versions of ruby gems

本文是小编为大家收集整理的关于管理冲突的ruby gems版本的处理方法,想解了管理冲突的ruby gems版本的问题怎么解决?管理冲突的ruby gems版本问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在构建一个加载用户提供的 ruby​​ 代码的框架.它基本上是一种插件机制.我希望用户提供 ruby​​ 代码以便能够需要自己的 gem.我打算让"插件"包包含一个带有 gems 的供应商目录.

如何加载插件所需的 gem 而不会与我的框架的 gem 冲突?例如,如果我的框架使用 treetop 版本 1.3.0,而插件使用 treetop 1.4.2,我希望每个都使用它们指定的版本.

同样,有没有办法防止插件相互冲突?

我查看了 gem_plugin、_why 的沙箱和其他一些工具.但我没有看到任何专门处理这种情况的库 - 我认为它之前已经完成了.

我还查看了 Bundler 的内部结构,以了解它如何管理 gem 版本.如果需要,我准备做一些相当复杂的事情.但我仍然不确定如何去做.

我在如何实现这一点上也有很大的自由度.所以如果你认为我说错了树,请说出来.

感谢您的建议.

旁注:我在写这篇文章时突然想到,我需要类似于 Java servlet 容器中的类加载器的东西.WAR 文件可以包含 jar 文件,并且 Web 应用程序的类加载器将优先选择位于全局类路径中的 jar 文件.ruby 中有什么方法可以分割 ruby​​ 的"类路径"(即 load_path、require 等)?

推荐答案

坦率地说,你不能同时加载同一个 gem 的两个版本.

Bundler 在查看所有必需的 gem 并找到各种重叠依赖项的解决方案方面做得很好(ish),但即便如此,它也仅限于一次仅加载一个版本的 gem.

这导致插件开发人员必须不断更新以支持在依赖 gem 中所做的任何更改,以避免出现您描述的情况.

(不要让我开始讨论各种相互竞争的 JSON 实现所导致的问题,以及当您有多个 gem 依赖项都需要不同的依赖项时必须经历的痛苦.)

本文地址:https://www.itbaoku.cn/post/786347.html