2010-11-26 8 views
5

Esiste un plug-in per sbt che installa automaticamente JRuby e aggiunge alcuni hook per eseguire automaticamente gli script in determinati punti (ad es. Prima della compilazione).Plugin Sbt per jruby

Sfondo: per un progetto (di sollevamento), desidero utilizzare sass o, più specificamente, compass come strumento per generare il css. Sfortunatamente, un clone Java o Scala di sass non sarebbe sufficiente.

Ovviamente, non sarebbe affatto un problema generare semplicemente il css manualmente e quindi inserire entrambi nel repository e nessuno ha mai avuto bisogno di preoccuparsene.

D'altra parte, per facilitare lo sviluppo su diversi sistemi, preferisco avere una chiara dipendenza all'interno di sbt che semplicemente fa il lavoro.

Esiste un modo per raggiungere questo obiettivo?
In generale: esiste un modo per eseguire gli script JRuby da Scala?

Modifica Aggiunto maven-2 ai tag. Forse c'è un repository di maven per JRuby che mi permette di consegnarlo e usarlo in qualche modo.

+1

C'è http://mvnrepository.com/artifact/org.jruby/ –

+1

Grande. Ora, come utilizzerei questo per installare ed eseguire gems tramite bundler? – Debilski

risposta

4

Anche se non è la soluzione più elegante, è sempre possibile chiamare script esterni utilizzando il supporto processo in SBT.

import sbt._ 
import Process._ 

class Project(info: ProjectInfo) extends DefaultProject(info) { 
    lazy val runSomething = task { 
    "ruby somescript.rb" ! log 
    None 
    } 
} 

C'è un po 'di più informazioni sul supporto processo esterno disponibile qui: http://code.google.com/p/simple-build-tool/wiki/Process

+2

Ma sfortunatamente, richiede l'installazione di ruby. Preferirei che sbt gestisca tutte le dipendenze. – Debilski

+1

Abbastanza giusto. Aggiungere jruby come dipendenza dovrebbe essere abbastanza facile, ma far sì che SBT lo chiami richiederà un po 'più di lavoro. Probabilmente otterrei l'API di scripting, ma non l'ho usata troppo a lungo, quindi montare un esempio richiederebbe un po '. Mi piacerebbe avere questa opzione, quindi indagherò e vedrò cosa posso inventare. –

1

provare la mia sbt plugin da github. Per ora è molto semplice, ma dovrebbe scaricare il jar jruby e consentire di chiamare un file .rb prima della compilazione.

Il coraggio del plugin sono molto semplici:

import sbt._ 

    object SbtJRuby extends Plugin { 
     object SbtJRubySettings { 
     lazy val settings = Seq(Keys.commands += jirb, tx, jrubyFile := file("fnord.rb")) 
     } 

     def jirb = Command.args("jirb", "<launch jirb>") { (state, args) => 
     org.jruby.Main.main(List("-S", "jirb").toArray[String]) 
     state 
     } 

     val jruby = TaskKey[Unit]("jruby", "run a jruby file") 
     val jrubyFile = SettingKey[File]("jruby-file", "path to file to run with JRuby") 

     val tx = jruby <<= (jrubyFile, Keys.baseDirectory) map { (f: File, b: File) => 
     val rb = (b/f.toString).toString 
     // println("jruby with " + rb) 
     org.jruby.Main.main(List(rb).toArray[String]) 
     } 
    } 

Davvero tutto si sta facendo sta chiamando il file jar JRuby con il nome del file rb aver superato in E, naturalmente, l'aggiunta di JRuby stessa come. una dipendenza gestito:

libraryDependencies ++= Seq(
    "org.jruby" % "jruby-complete" % "1.6.5" 
) 

si aggiunge anche un comando "jirb" alla console Scala che ti mette in una sessione jirb.