Я хотел бы использовать отличный Sass как часть процесса сборки. Мой процесс сборки управляется Gradle. Это означает написание плагина для запуска Sass. Sass - это Ruby, а Gradle - это Groovy, но поскольку Groovy работает на JVM, я могу использовать JRuby для его запуска, с помощью скриптового API Java. Скрипты Gradle получают зависимости в виде файлов jar; я могу получить JRuby из Maven Central, но мне нужно будет самому упаковать Sass как банку.
Я пытался подписаться на Самоцветы в банке Ника Зигера для этого, но безуспешно. Что бы я ни делал, я просто не могу заставить JRuby забрать драгоценный камень Sass.
Чтобы изолировать проблему, я написал минимальную программу Java (не Gradle), которая пытается использовать Sass через JRuby - я изобретательно назвал ее JSass:
Есть два или три интересных момента. Первый - это скрипт generate-gem-jar.sh, который создает банку с драгоценным камнем:
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);
Третий - это сценарий Ruby, который основной класс пытается использовать для работы с Sass:
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
Что я делаю неправильно?