2012-03-23 18 views
5

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?

+0

Czy kiedykolwiek pracowałeś z odpowiedzią z Kares lub alternatywnego rozwiązania? – nopuck4you

+0

@ 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. –

+3

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

Odpowiedz

0

wydaje mi się, że to będzie działać tylko tak długo, jak to jest realizowane jako java -jar -rgems.jar można wykonywać tę pracę, nie musisz pakować go w JAR prostu wziąć Sass-xxx katalog (wynik gem install sass) i zapisać go w znanym miejscu i dodać to lib do $LOAD_PATH ... odkąd zbudowano już słoik Przypuszczam, że będąc w bieżącym katalogu roboczym:

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

wymaga przed ostatnią linią: rubyEngine.eval(script, context);

jeśli nie ma go w słoju, powinno być takie samo, wystarczy podać ścieżkę np.

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

Pamiętaj, że zadziała to tylko wtedy, gdy klejnoty Sass nie będą zależały od innych klejnotów!