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?
Hai mai funzionato con la risposta di Kares o soluzione alternativa? – nopuck4you
@ 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. –
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