2012-03-23 14 views
5

Vorrei utilizzare l'eccellente Sass come parte del mio processo di compilazione. Il mio processo di compilazione è gestito da Gradle. Ciò significa scrivere un plugin per eseguire Sass. Sass è Ruby e Gradle è in Groovy, ma poiché Groovy gira su JVM, posso usare JRuby per eseguirlo, usando Java scripting API. Gli script Gradle hanno dipendenze sotto forma di file jar; Posso ottenere JRuby da Maven Central, ma ho bisogno di confezionare Sass come un barattolo me stesso.Come posso usare gems-in-a-jar con JRuby incorporato?

Ho provato a seguire Nick Sieger's gems-in-a-jar procedure per farlo, ma non ho avuto successo. Qualunque cosa io faccia, non riesco a convincere JRuby a raccogliere la gemma Sass.

Per isolare il problema, ho scritto un programma Java minima (non Gradle), che cerca di utilizzare Sass via JRuby - i inventiva chiamo JSass:

ci sono due o tre bit interessanti. Il primo è lo script generate-gem-jar.sh, che costruisce il vaso gemma:

gem install -i build/gems sass --no-rdoc --no-ri 
jar cf lib/gemsass.jar -C build/gems . 

Il secondo è la classe so.demo.JSass, che corre 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); 

Il terzo è lo script di Ruby, che la classe principale cerca di impiego per funzionare Sass:

require 'sass' 
template = File.load(inputFile) 
sass_engine = Sass::Engine.new(template) 
output = sass_engine.render 
puts output 

il programma è in grado di caricare il motore di JRuby e eseguire lo script, ma non riesce a require 'sass', dicendo:

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 

Cosa sto facendo di sbagliato?

+0

Hai mai funzionato con la risposta di Kares o soluzione alternativa? – nopuck4you

+0

@ nopuck4you: No. L'approccio di Kares richiede che (a) lancio il programma tramite il jar runnable rgems, che non posso, e (b) che la gem è una directory decompressa, che davvero non voglio. Non ho avuto il tempo di attaccare davvero il problema da quando ho postato questa domanda, purtroppo. –

+3

Ho iniziato a lavorare nel mio codice usando un approccio simile. Mi sono imbattuto nello stesso identico errore che mi ha lasciato per 3 giorni. Risultò che il modo in cui stavo riconfezionando il sass-lang.gem in un JAR stava lasciando cadere i file gem in modo che JAR non fosse valido. Ho un progetto di lavoro per riconfezionare la gemma in un JAR qui: https://github.com/dmitrye/sass-gems. ed ecco un esempio di come lo sto consumando: https://github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/java/ro/isdc/wro/extensions/processor /support/sass/RubySassEngine.java. Fammi sapere se questo aiuta. – nopuck4you

risposta

0

mi sembra che funzionerà solo fino a quando viene eseguito come un java -jar -rgems.jar si può fare questo lavoro, non c'è bisogno di confezionarlo in un .jar basta prendere la directory sass-xxx (risultato di gem install sass) e conservarlo in un luogo conosciuto e inserirlo della directory lib alla $LOAD_PATH ... dal momento che hai costruito già il barattolo vorrei assumere che sia in una directory di lavoro corrente:

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

questa necessità per accadere prima della tua ultima riga rubyEngine.eval(script, context);

se non è nel barattolo dovrebbe essere lo stesso, basta specificare il percorso, ad es.

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

si prega di notare che questo funzionerà solo se sass gems non dipende da altre gemme!