sbt の multi-project 構成で xsbt-start-script-plugin を使う。

sbtでmulti-projectしたときstart-scriptどうしたらいいんだろう。sbt 'project foo' 'run' 相当のことをやりたい。

と思ったのですが、やってみたらすんなりできてしまいました。

// project/plugins.sbt
resolvers += Classpaths.typesafeResolver

addSbtPlugin("com.typesafe.startscript" % "xsbt-start-script-plugin" % "0.5.0")
// project/ScalaProject.scala
import sbt._
import sbt.Keys._
import com.typesafe.startscript.StartScriptPlugin


object ScalaProjectBuild extends Build {

  lazy val utils = Project(
    id = "utils",
    base = file("utils"),
    settings = Defaults.defaultSettings ++ Seq(
    )
  )

  lazy val hello = Project(
    id = "hello",
    base = file("hello"),
    settings = Defaults.defaultSettings ++ StartScriptPlugin.startScriptForClassesSettings
  ) aggregate (utils) dependsOn (utils)

  lazy val root = Project(
    id = "root",
    base = file("."),
    settings = Defaults.defaultSettings ++ StartScriptPlugin.startScriptForClassesSettings ++ Seq(
    )
  ) aggregate (utils, hello)

}


このように、start-script を作りたいプロジェクトにだけ start-script の設定をして、
rootプロジェクトなりそのプロジェクトなりで stage すれば良いだけです。


実行は project root (subdirectoryではなく) で

 ./hello/target/start

のようにすればOK。

補足

aggregate していると、stage したくないとこでも stage しちゃって良くないこともあるので、
そういうときは

StartScriptPlugin.stage in Compile := Unit

って書けって、READMEに書いてありました。