2010-11-26 39 views
5

是否有可用的sbt插件,它会自动安装JRuby并添加一些钩子以在某些点(例如编译之前)自动运行脚本。jruby的Sbt插件

背景:对于(提升)项目,我想使用sass,或者更具体地说,使用compass作为生成CSS的工具。遗憾的是,Sass的Java或Scala克隆还不够。

当然,只是手动生成css,然后将两者都放入存储库并且没有人需要关心它,这完全不成问题。另一方面,为了简化多个系统的开发,我宁愿在sbt中有一个明确的依赖关系,它只是简单地完成这项工作。

有什么办法可以达到这个目的吗?
或者一般来说:有没有办法从Scala内部运行JRuby脚本?

编辑将maven-2添加到标签。也许有一个JRuby的maven回购,它允许我以某种方式交付和使用它。

+1

There's http://mvnrepository.com/artifact/org.jruby/ – 2011-10-30 20:56:30

+1

太好了。现在,我将如何使用它通过bundler安装并执行gem? – Debilski 2011-10-30 23:27:20

回答

4

尽管它可能不是最优雅的解决方案,但您始终可以使用SBT中的Process支持调用外部脚本。

import sbt._ 
import Process._ 

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

有一个关于可用的外部进程支持在这里更多的信息:http://code.google.com/p/simple-build-tool/wiki/Process

1

sbt plugin从GitHub尝试。目前它是非常简单的,但它应该下载jruby jar并允许在编译之前调用.rb文件。

插件的胆子非常简单:

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]) 
     } 
    } 

真的所有它做的是叫你在已通过的RB文件的名称JRuby的jar文件,当然增加的JRuby本身。可管理的依赖关系:

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

它还向Scala控制台添加了一个“jirb”命令,它将您置于jirb会话中。