Как я могу использовать драгоценные камни в банке со встроенным JRuby?

Я хотел бы использовать отличный 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

Что я делаю неправильно?


person Tom Anderson    schedule 23.03.2012    source источник
comment
У вас когда-нибудь получалось, что это работает с ответом от Кареса или альтернативным решением?   -  person nopuck4you    schedule 16.04.2012
comment
@ nopuck4you: Нет. Подход Кареса требует, чтобы (а) я запускал программу с помощью исполняемого jar-файла rgems, чего я не могу, и (б) чтобы драгоценный камень был распакованным каталогом, что мне действительно не нужно. У меня, к сожалению, не было времени, чтобы лично заняться проблемой с тех пор, как я разместил этот вопрос.   -  person Tom Anderson    schedule 17.04.2012
comment
Я получил sass, работающий в моем коде, используя аналогичный подход. Я столкнулся с той же ошибкой, которая поставила меня в тупик на 3 дня. Оказалось, что способ, которым я переупаковывал sass-lang.gem в JAR, отбрасывал файлы гемов, так что JAR был недопустимым. У меня есть рабочий проект по переупаковке драгоценного камня в JAR здесь: github.com/dmitrye/sass- драгоценные камни. и вот пример того, как я его употребляю: github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/. Позвольте мне знать, если это помогает.   -  person nopuck4you    schedule 18.04.2012
comment
@ nopuck4you: Ты герой. Я прошел через две наши реализации с зубчатым гребнем, и это привело к одной существенной разнице: вы используете jruby-complete, а я использовал jruby-core. Базовая версия не включает поддержку драгоценных камней. Изменив его, чтобы завершить работу, моя собственная банка SASS работала нормально (хотя мой код Ruby также был сломан, но это еще одна проблема). Если вы хотите написать ответ, резюмирующий ваш комментарий и акцентирующий внимание на версии JRuby, я с радостью его приму!   -  person Tom Anderson    schedule 30.04.2012
comment
Я настоятельно рекомендую вам опубликовать плагин Gradle на github или что-то в этом роде (если вы можете это сделать) и сообщить Gradle о его существовании. Плагин SaSS gradle был бы отличным дополнением к их библиотеке, и это то, что я искал сегодня.   -  person Lo-Tan    schedule 13.05.2012
comment
Вы имеете в виду github.com/youdevise/SassPlugin? Он еще не совсем готов для прайм-тайма, поэтому я не публиковал его. Я не думал рассказывать об этом ребятам из Gradle, но я так и сделаю. Я бы очень хотел добавить артефакт в Maven Central или, по крайней мере, опубликовать его где-нибудь в открытом доступе, но для этого потребуется немного больше работы.   -  person Tom Anderson    schedule 13.05.2012
comment
Рад слышать, что вы уже взяли на себя обязательства. Если вы хотите поместить свои артефакты (например, JAR-файл драгоценного камня) в Maven Central, вы можете проверить OSS, инициатива Sonatype. Я действительно верю, что Maven Central автоматически.   -  person Lo-Tan    schedule 14.05.2012
comment
Да, я знаю об этом, и похоже, что это самый простой доступный маршрут. Что мне нужно сделать, так это создать проект внутри моей компании и опубликовать артефакты в нашем внутреннем репозитории, затем собрать вместе все наши проекты с открытым исходным кодом и настроить процесс публикации, чтобы разместить их артефакты где-то отдельно от нашего проприетарного кода, затем создайте способ переноса артефактов из этого в Sonatype OSS, а затем разработайте для них разумную схему управления версиями (которой у нас в настоящее время нет!). Это в некоторой степени сложно, но это то, что нужно, чтобы сделать его устойчивым. Так что не задерживайте дыхание!   -  person Tom Anderson    schedule 14.05.2012
comment
Нет, не торопитесь :) А пока я слежу за тем, что вы здесь сделали, чтобы мои вещи работали. Спасибо =)   -  person Lo-Tan    schedule 14.05.2012
comment
Знаете ли вы github.com/robfletcher/gradle-compass?   -  person ChrLipp    schedule 01.07.2014


Ответы (1)


мне кажется, что он будет работать только до тех пор, пока он выполняется как java -jar -rgems.jar, вы можете выполнить эту работу, вам не нужно упаковывать его в .jar, просто возьмите каталог sass-xxx ( результат gem install sass) и сохраните его в известном месте и добавьте его каталог lib в $LOAD_PATH ... поскольку вы уже создали банку, я бы предположил, что она находится в текущем рабочем каталоге:

rubyEngine.eval("$LOAD_PATH << 'file://gemsass.jar!/gems/sass-3.1.15/lib'", context);

это должно произойти до вашей последней строчки rubyEngine.eval(script, context);

если его нет в банке, он должен быть таким же, просто укажите путь, например.

rubyEngine.eval("$LOAD_PATH << 'file:/home/42/gems/sass-3.1.15/lib'", context);

обратите внимание, что это будет работать только в том случае, если sass gems не зависит от других драгоценных камней!

person kares    schedule 23.03.2012