5

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

背景:对于(电梯)项目,我想使用sass,或者更具体地说,指南针作为生成 css 的工具。不幸的是,sass 的 Java 或 Scala 克隆是不够的。

当然,只需手动生成 css 然后将两者都放入存储库中,这根本不是问题,没有人需要关心它。

另一方面,为了简化多个系统的开发,我宁愿在 sbt 内部有一个明确的依赖关系,它可以简单地完成工作。

有什么办法可以做到这一点?
或者一般来说:有没有办法从 Scala 内部运行 JRuby 脚本?

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

4

2 回答 2

4

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

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

于 2010-11-29T04:13:27.460 回答
1

从 github尝试我的sbt 插件。它现在非常简单,但它应该下载 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 会话。

于 2011-12-21T00:04:47.420 回答