Chciałbym użyć znakomitego Sass jako części mojego procesu kompilacji. Mój proces tworzenia jest zarządzany przez Gradle. Oznacza to pisanie wtyczki uruchamiającej Sass. Sass to Ruby, a Gradle jest w Groovy, ale ponieważ Groovy działa na JVM, mogę użyć JRuby, aby go uruchomić, używając Java scripting API. Skrypty Gradle pobierają zależności w postaci plików jar; mogę uzyskać JRuby z Maven Central, ale będę musiał sasić pakiet Sass jako słoik.Jak mogę użyć gems-in-a-jar z osadzonym JRuby?
Próbowałem wykonać to, aby wykonać Nick Sieger's gems-in-a-jar procedure, ale nie odniosłem sukcesu. Bez względu na to, co robię, po prostu nie mogę zmusić JRuby do wzięcia klejnotu Sass.
Aby wyizolować problem, napisałem minimalny Java (nie Gradle) programu, który próbuje wykorzystać Sass poprzez JRuby - I wynalazkiem nazwać JSass:
Istnieją dwa lub trzy interesujące fragmenty. Pierwszym z nich jest skrypt generate-gem-jar.sh, która buduje słoik GEM:
gem install -i build/gems sass --no-rdoc --no-ri
jar cf lib/gemsass.jar -C build/gems .
Druga to klasa so.demo.JSass, która biegnie 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);
trzeci jest skrypt Ruby której głównym klasa próbuje używać do obsługi Sass:
require 'sass'
template = File.load(inputFile)
sass_engine = Sass::Engine.new(template)
output = sass_engine.render
puts output
Program jest w stanie załadować silnik JRuby i wykonać skrypt, ale nie jest on w require 'sass'
, mówiąc:
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
Co robię źle?
Czy kiedykolwiek pracowałeś z odpowiedzią z Kares lub alternatywnego rozwiązania? – nopuck4you
@ nopuck4you: Nie. Podejście Karego wymaga, aby (a) uruchomiłem program za pomocą słoika uruchamianego przez rgems, którego nie mogę, i (b) że klejnot jest rozpakowanym katalogiem, którego naprawdę nie chcę. Nie miałem czasu, aby naprawdę zaatakować problem od czasu, gdy zadałem to pytanie, niestety. –
Mam sass pracujących w moim kodu przy użyciu podobnego podejścia. Wpadłem na dokładnie ten sam błąd, który zaskoczył mnie przez 3 dni. Okazało się, że tak jak przepakowałem sass-lang.gem do JAR upuszcza pliki gemów, aby JAR był nieważny. Mam gotowy projekt do przepakowania tego klejnotu do JAR tutaj: https://github.com/dmitrye/sass-gems. a oto przykład tego, jak go wykorzystuję: https://github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/java/ro/isdc/wro/extensions/processor /support/sass/RubySassEngine.java. Daj mi znać, jeśli to pomoże. – nopuck4you