Java 我怎样才能给JRuby一个伪文件系统呢?
以前我试着去做,我已经成功了() 我现在把注意力转向这个问题 我已经将JRuby集成到我的Maven插件中,我可以很好地调用SASS编译器,所以现在最后一步(在从hack land到可维护代码的伟大重构之前)是伪造JRuby看到的路径 我的感觉是,我将无法重用我的Rhino技巧(在Rhino作用域中重新映射java.io.File类适配器),因为Ruby通常没有适配器层来纠正不同Ruby VM之间的差异 所以我的下一个想法是猴子补丁。。。但我不确定这项工作会有多大 使用JavaScript,我只需伪造Java 我怎样才能给JRuby一个伪文件系统呢?,java,ruby,jruby,Java,Ruby,Jruby,以前我试着去做,我已经成功了() 我现在把注意力转向这个问题 我已经将JRuby集成到我的Maven插件中,我可以很好地调用SASS编译器,所以现在最后一步(在从hack land到可维护代码的伟大重构之前)是伪造JRuby看到的路径 我的感觉是,我将无法重用我的Rhino技巧(在Rhino作用域中重新映射java.io.File类适配器),因为Ruby通常没有适配器层来纠正不同Ruby VM之间的差异 所以我的下一个想法是猴子补丁。。。但我不确定这项工作会有多大 使用JavaScript,我只
java.io.File
,java.io.FileReader
,java.io.FileWriter
,java.io.FileInputStream
,java.io.FileOutputStream
我需要多少钱才能在Ruby运行时运行monkey patch。。。或者我最好使用一个基于ASM的重写类加载器从JRuby本身下面拉地毯(在这里我冒着破坏合法文件使用以加载eg Gems的风险)这是我关于SASS编译器的特定问题的答案,但不是对如何处理monkey patch JRuby以给它一个伪文件系统这一一般问题的答案 原来Sass有一个
Sass::Importer::Base
的概念,它是解析.scss
和.Sass
文件的基类。因此,我所需要做的就是创建我自己的实现,它将委托给我的虚拟文件系统,并配置传递给Sass::Engine.new
的选项,以便使用我的导入器实现替换默认的基于文件系统的导入器
虽然我在试图编译它时遇到了一些问题,可能是因为它依赖于与我的测试经验形成对比的较少的支持,其中是独立的
更新
关于基于ASM的重写类加载器。这种方法的诀窍可能是使用AspectC在JRuby运行时中只修改那些类。换句话说,仅当类扩展RubyObject时才应用方面。这将保留JRuby加载ruby源代码的合法需求,同时为嵌入式VM提供假文件系统
关于Monkey补丁,为了确保Monkey补丁有效,Ruby的文件API提供的所有等效方法似乎都需要做大量的工作,特别是考虑到我们不知道SASS编译器将使用哪些API的确切范围
所以,我想完整的答案是:“你不想做猴子补丁或ASM重写,因为你想使用的库提供了一个很好的抽象,可以将虚拟文件系统提供给它”Tcl已经有了一个虚拟文件系统多年了,所以对他们是如何实现的进行一些研究可能会有所帮助;谷歌:“tcl vfs”我已经有了一个虚拟文件系统(用于JavaScript),但我正在尝试将我没有编写的代码集成到该文件系统中。如果代码是用java编写的,我将使用
aspectc
截取对第三方代码jar中java文件处理的所有调用。这里的代码是用ruby编写的,因此需要一种不同的理解方法,只是试图从另一个角度来解决问题。我错过了你问题的JRuby方面。