我想在我的构建过程中使用出色的Sass 。我的构建过程由Gradle管理。这意味着编写一个插件来运行 Sass。Sass 是 Ruby,Gradle 是在 Groovy 中,但由于 Groovy 在 JVM 上运行,我可以使用JRuby来运行它,使用 Java脚本 API。Gradle 脚本以 jar 文件的形式获取依赖;我可以从Maven Central获取 JRuby ,但我需要自己将 Sass 打包为 jar。
我尝试按照Nick Sieger 的 gems-in-a-jar 程序来执行此操作,但没有成功。无论我做什么,我都无法让 JRuby 拿起 Sass gem。
为了隔离这个问题,我编写了一个最小的 Java(不是 Gradle)程序,它试图通过 JRuby 使用 Sass——我创造性地称之为 JSass:
有两三个有趣的地方。第一个是脚本generate-gem-jar.sh,它构建 gem jar:
gem install -i build/gems sass --no-rdoc --no-ri
jar cf lib/gemsass.jar -C build/gems .
第二个是运行 JRuby 的so.demo.JSass类:
ScriptEngine rubyEngine = new ScriptEngineManager().getEngineByName("jruby");
ScriptContext context = rubyEngine.getContext();
context.setAttribute("inputFile", inputFile, ScriptContext.ENGINE_SCOPE);
String script = IOUtils.toString(JSass.class.getResourceAsStream("sassdriver.rb"));
rubyEngine.eval(script, context);
第三个是主类试图用来操作 Sass 的 Ruby 脚本:
require 'sass'
template = File.load(inputFile)
sass_engine = Sass::Engine.new(template)
output = sass_engine.render
puts output
该程序能够加载 JRuby 引擎并执行脚本,但它在 处失败require 'sass'
,说:
LoadError: no such file to load -- sass
require at org/jruby/RubyKernel.java:1033
(root) at <script>:1
org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- sass
at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:132)
at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:90)
at so.demo.JSass.main(JSass.java:24)
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass
Exception in thread "main" javax.script.ScriptException: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass
at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:115)
at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:93)
at so.demo.JSass.main(JSass.java:24)
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass
我究竟做错了什么?