我怎么能修补JRuby给它一个伪文件系统?

时间:2013-01-30 18:38:07

标签: java ruby jruby

以前我试图give the Java engine for JavaScript - rhino - a pseudo file system并且我已经取得了成功(jszip maven plugin

我现在将注意力转向SASS compiler

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

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

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

使用JavaScript我只需假冒java.io.Filejava.io.FileReaderjava.io.FileWriterjava.io.FileInputStreamjava.io.FileOutputStream

我需要在Ruby运行时中修补多少补丁......或者我最好使用基于ASM的重写类加载器从JRuby本身(我冒险破坏合法的文件使用以加载例如Gems)中拉出地毯< / p>

1 个答案:

答案 0 :(得分:1)

关于我对SASS编译器的具体问题的答案,但不能回答如何对JRuby进行修补以使其成为虚假文件系统的一般性问题。

事实证明,Sass有一个Sass::Importer::Base概念,它是解析.scss.sass文件的基类。所以我需要做的就是创建我自己的实现,该实现委托给我的虚拟文件系统并配置传递给Sass::Engine.new的选项,这样基于默认文件系统的导入器就会被我的Importer实现替换。

Seems to be working虽然我有一些问题试图让它编译Foundation 3,可能是因为它依赖于Compass,这与我在LESS支持方面的测试经验形成对比,其中{ {3}}是独立的。

更新

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

关于Monkey-patching,似乎会有很多工作填充Ruby的File API提供的所有等效方法,以确保猴子补丁成立,特别是考虑到我们不知道SASS编译器将使用的确切脚印。

所以,我想完整的答案是:“你不想做猴子修补或ASM重写,因为你想要使用的库提供了一个很好的抽象,无论如何都允许它提供虚拟文件系统”