我正在构建一个加载用户提供的 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 依赖项都需要不同的依赖项时您必须经历的痛苦。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)