gpt4 book ai didi

ruby - 管理 ruby​​ gem 的冲突版本

转载 作者:数据小太阳 更新时间:2023-10-29 08:34:34 28 4
gpt4 key购买 nike

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

如何加载插件所需的 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 并找到各种重叠依赖项的解决方案方面做得很好(差不多),但即便如此,它也仅限于一次只能加载一个版本的 gem。

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

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

关于ruby - 管理 ruby​​ gem 的冲突版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4579465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com