0

以前我试图给 JavaScript 的 Java 引擎 - rhino - 一个伪文件系统,我取得了成功(jszip maven 插件

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

我已经将 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 运行时打多少补丁......或者我最好使用基于 ASM 的重写类加载器从 JRuby 本身下面拉出地毯(我冒着破坏合法文件用于加载例如 Gems 的风险)

4

1 回答 1

1

对我关于 SASS 编译器的具体问题的回答,但不是对如何对 JRuby 进行猴子补丁以提供假文件系统的一般问题的回答。

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

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

更新

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

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

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

于 2013-01-31T16:43:52.723 回答