繁体   English   中英

我该如何修补JRuby以为其提供伪文件系统?

[英]How can I monkey patch JRuby to give it a pseudo file system?

以前,我曾尝试为JavaScript提供Java引擎 -rhino- 伪文件系统,并且我已经成功了( jszip maven插件

我现在将注意力转向SASS编译器

我已经将JRuby集成到我的Maven插件中,并且可以很好地调用SASS编译器,所以现在的最后一步(在从hack-land重构为可维护的代码之前)是伪造JRuby看到的路径,

我的感觉是我将无法重用Rhino技巧(我在Rhino范围内重新映射java.io.File类适配器),因为Ruby通常没有适配器层来纠正不同Ruby VM之间的差异。

所以我的下一个想法是猴子补丁...但是我不确定这会是多么大的工作...

使用JavaScript我只需要伪造java.io.Filejava.io.FileReaderjava.io.FileWriterjava.io.FileInputStreamjava.io.FileOutputStream

在Ruby运行时中,需要多少猴子补丁……或者我更好地使用基于ASM的重写类加载器从JRuby本身中提取地毯(在此情况下,我可能会破坏合法的文件加载方式来加载例如Gems)

我的有关SASS编译器的特定问题的答案,但不是对猴子补丁JRuby使其仿造文件系统的一般问题的答案。

事实证明,萨斯拥有的概念Sass::Importer::Base是解决的基类.scss.sass文件。 因此,我要做的就是创建自己的实现,该实现委派给我的虚拟文件系统,并配置传递给Sass::Engine.new的选项,以便将默认的基于文件系统的导入器替换为导入器实现。

似乎可以正常工作,尽管我在尝试使其编译Foundation 3时遇到了一些问题,也许是因为它依赖于Compass ,这与我对LESS支持( Bootstrap是独立的)的测试经验形成了对比。

更新资料

关于基于ASM的重写类加载器。 也许这种方法的诀窍是使用AspectC来仅修改JRuby运行时中的那些类。 换句话说,仅当类扩展RubyObject时才应用方面。 这应该保留JRuby加载红宝石源代码的合法需求,同时为嵌入式VM提供伪造的文件系统。

关于猴子补丁,似乎要进行大量工作来填充Ruby的File API提供的所有等效方法,以确保猴子补丁可以保存,特别是考虑到我们不知道猴子补丁的确切占用空间, SASS编译器将使用哪些API。

因此,我想完整的答案是:“您不想进行猴子补丁或ASM重写,因为您要使用的库提供了一个很好的抽象,无论如何都可以将其馈送到虚拟文件系统中”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM