2012-03-23 12 views
5

Me gustaría utilizar el excelente Sass como parte de mi proceso de compilación. Mi proceso de compilación está administrado por Gradle. Eso significa escribir un complemento para ejecutar Sass. Sass es Ruby, y Gradle está en Groovy, pero como Groovy se ejecuta en JVM, puedo usar JRuby para ejecutarlo, usando Java scripting API. Los scripts de Gradle obtienen dependencias en forma de archivos jar; Puedo obtener JRuby desde el Maven Central, pero necesitaré empaquetar Sass como un bote.¿Cómo puedo usar gems-in-a-jar con JRuby incrustado?

He intentado seguir Nick Sieger's gems-in-a-jar procedure para hacer esto, pero no he tenido éxito. No importa lo que haga, no puedo hacer que JRuby recoja la gema Sass.

Para aislar el problema, he escrito un programa Java mínima (no Gradle) que trata de utilizar Sass través JRuby - i inventiva llamo JSASS:

hay dos o tres bits interesantes El primero es el guión generate-gem-jar.sh, que construye el frasco joya:

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

La segunda es la clase so.demo.JSass, que se extiende 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); 

La tercera es la secuencia de comandos de Ruby, que la clase principal intenta utilizar para operar Sass:

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

el programa es capaz de cargar el motor JRuby y ejecutar la secuencia de comandos, pero falla en require 'sass', diciendo:

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 

¿Qué estoy haciendo mal?

+0

¿Alguna vez ha funcionado con la respuesta de Kares o una solución alternativa? – nopuck4you

+0

@ nopuck4you: No. El enfoque de Kares requiere que (a) ejecute el programa a través del jar ejecutable de rgems, lo cual no puedo, y (b) que la gema es un directorio descomprimido, lo cual realmente no quiero. No he tenido tiempo de realmente atacar el problema yo mismo desde que publiqué esta pregunta, por desgracia. –

+3

Tengo sass trabajando en mi código usando un enfoque similar. Me encontré con el mismo error exacto que me dejó perplejo durante 3 días. Resultó que la forma en que estaba reempaquetando el sass-lang.la gema en un JAR estaba soltando los archivos gem para que el JAR no fuera válido. Tengo un proyecto en funcionamiento para volver a empaquetar la gema en un JAR aquí: https://github.com/dmitrye/sass-gems. y aquí hay un ejemplo de cómo lo estoy consumiendo: https://github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/java/ro/isdc/wro/extensions/processor /support/sass/RubySassEngine.java. Déjeme saber si esto ayuda. – nopuck4you

Respuesta

0

me parece que sólo funcionará siempre y cuando se ejecuta como un java -jar -rgems.jar puede hacer este trabajo, no es necesario empaquetarla en un .jar acaba de tomar el directorio Sass-xxx (resultado de gem install sass) y almacenarlo en un lugar conocido y añadir que es lib a la $LOAD_PATH ... ya que se ha construido el frasco ya que supongo que estar en un directorio de trabajo actual:

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

este necesidades suceder antes de su última línea rubyEngine.eval(script, context);

si no está en el contenedor debe ser el mismo solo especifique la ruta, p.

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

ten en cuenta que esto solo funcionará si sass gems no depende de otras gemas.

Cuestiones relacionadas