我想在构建过程中使用优秀的Sass。我的构建过程由Gradle管理。这意味着编写一个插件来运行Sass。 Sass是Ruby,Gradle在Groovy中,但是由于Groovy在JVM上运行,我可以使用JRuby来运行它,使用Java scripting API。 Gradle脚本以jar文件的形式获得依赖关系;我可以从Maven Central获得JRuby,但我需要自己将Sass打包成jar。
我试图按照Nick Sieger's gems-in-a-jar procedure这样做,但没有成功。无论我做什么,我都无法让JRuby拿起Sass宝石。
为了解决这个问题,我写了一个最小的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 .
第二个是so.demo.JSass类,它运行JRuby:
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
我做错了什么?
答案 0 :(得分:0)
在我看来只要它作为java -jar -rgems.jar
执行它就会起作用
你可以使这个工作,你不需要在.jar中打包它只需取 sass-xxx 目录(gem install sass
的结果)并将其存储在一个已知的地方并添加它是$LOAD_PATH
的lib目录...因为你已经构建了jar我会假设它在当前的工作目录中:
rubyEngine.eval("$LOAD_PATH << 'file://gemsass.jar!/gems/sass-3.1.15/lib'", context);
这需要在您的最后一行rubyEngine.eval(script, context);
如果它不在jar中,它应该是相同的,只需指定路径,例如
rubyEngine.eval("$LOAD_PATH << 'file:/home/42/gems/sass-3.1.15/lib'", context);
请注意,这只适用于sass宝石不依赖于其他宝石的情况!