Воспроизведение суб-проектов: как конвертировать в build.sbt

У меня работает многомодульное приложение Play 2.2, которое организовано так...

myApp
  + app
  + conf
  + project
      + build.properties
      + Build.scala
      + plugin.sbt

... где Build.scala содержит следующие утверждения:

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName         = "myApp"
  val appVersion      = "1.0-SNAPSHOT"

  val authDependencies = Seq(
    "se.radley" %% "play-plugins-salat" % "1.3.0"
  )

  val mainDependencies = Seq(
    "se.radley" %% "play-plugins-salat" % "1.3.0"
  )

  lazy val auth = play.Project(
    appName + "-auth",
    appVersion,
    authDependencies,
    path = file("modules/auth")).settings(
      lessEntryPoints <<= baseDirectory(customLessEntryPoints),
      routesImport += "se.radley.plugin.salat.Binders._",
      templatesImport += "org.bson.types.ObjectId",
      testOptions in Test := Nil,
      resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)
    )

  lazy val main = play.Project(
    appName,
    appVersion,
    mainDependencies).settings(
      scalacOptions += "-language:reflectiveCalls",
      routesImport += "se.radley.plugin.salat.Binders._",
      templatesImport += "org.bson.types.ObjectId",
      testOptions in Test := Nil,
      lessEntryPoints <<= baseDirectory(customLessEntryPoints),
      resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)
    ).dependsOn(auth).aggregate(auth)

  def customLessEntryPoints(base: File): PathFinder = {
    (base / "app" / "assets" / "stylesheets" / "bootstrap" * "bootstrap.less") +++
    (base / "app" / "assets" / "stylesheets" * "*.less")
  }
}

object Resolvers {

  val scalaSbt = Resolver.url("Scala Sbt", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots"))(Resolver.ivyStylePatterns)
  val sonatype = Resolver.sonatypeRepo("snapshots")
}

Теперь, прочитав Скачать 2.2 документацию, похоже, что я должен преобразовать свой проект в build.sbt:

В следующем примере используется файл build.scala для объявления play.Project. Этот подход был способом, которым приложения Play были определены до версии 2.2. Этот подход сохраняется для обеспечения обратной совместимости. Мы рекомендуем вам преобразовать в подход на основе build.sbt или, если вы используете build.scala, вы используете sbts Тип проекта и макрос проекта.

Есть ли какой-нибудь рабочий пример, описывающий замену project/build.scala на build.sbt? Я прочитал несколько коротких статей здесь и там... но мне не удалось получить рабочий проект Play.

Ответы

Ответ 1

Нет необходимости срочно преобразовывать вашу сборку в build.sbt. build.sbt проще, но в основном просто скомпилируется в Build.scala.

Другой ответ на этот вопрос будет работать, но, возможно, немного подробный. Начните с документации SBT:

http://www.scala-sbt.org/0.13.0/docs/Getting-Started/Multi-Project.html

Теперь создайте свой основной проект и подпроекты и поместите свои основные параметры проекта в основной файл build.sbt:

lazy val auth = project.in(file("modules/auth"))

lazy val main = project.in(file(".")).dependsOn(auth).aggregate(auth)

playScalaSettings

name := "myApp"

version := "1.0-SNAPSHOT"

libraryDependencies += "se.radley" %% "play-plugins-salat" % "1.3.0"

scalacOptions += "-language:reflectiveCalls"

routesImport += "se.radley.plugin.salat.Binders._"

templatesImport += "org.bson.types.ObjectId"

testOptions in Test := Nil

lessEntryPoints <<= baseDirectory(customLessEntryPoints)

resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)

object Resolvers {
  val scalaSbt = Resolver.url("Scala Sbt", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots"))(Resolver.ivyStylePatterns)
  val sonatype = Resolver.sonatypeRepo("snapshots")
}

И теперь, в modules/auth/build.sbt, поместите свои настройки для модуля auth:

name := "myApp-auth"

lessEntryPoints <<= baseDirectory(customLessEntryPoints)

routesImport += "se.radley.plugin.salat.Binders._"

templatesImport += "org.bson.types.ObjectId"

testOptions in Test := Nil

resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)

Во всяком случае, это может потребоваться немного подстройки, но, надеюсь, вы поняли.

Ответ 2

если вы используете build.scala, вы используете sbts Тип проекта и макрос проекта

Замените play.Project на Project и исправьте аргументы в соответствии с ScalaDoc, это должно быть что-то вроде

lazy val auth = Project(
    appName + "-auth",
    file("modules/auth")).settings(
      version := appVersion,
      libraryDependencies ++= authDependencies,
      lessEntryPoints <<= baseDirectory(customLessEntryPoints),
      routesImport += "se.radley.plugin.salat.Binders._",
      templatesImport += "org.bson.types.ObjectId",
      testOptions in Test := Nil,
      resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)
    )

lazy val main = Project(
    appName,
    file("app")).settings(
      version := appVersion,
      libraryDependencies ++= mainDependencies,
      scalacOptions += "-language:reflectiveCalls",
      routesImport += "se.radley.plugin.salat.Binders._",
      templatesImport += "org.bson.types.ObjectId",
      testOptions in Test := Nil,
      lessEntryPoints <<= baseDirectory(customLessEntryPoints),
      resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)
    ).dependsOn(auth).aggregate(auth)

Эти же определения можно использовать вместо build.sbt. Я бы также извлек общие настройки:

val commonSettings = Seq(
  version := appVersion,
  routesImport += "se.radley.plugin.salat.Binders._",
  templatesImport += "org.bson.types.ObjectId",
  testOptions in Test := Nil,
  lessEntryPoints <<= baseDirectory(customLessEntryPoints),
  resolvers ++= Seq(Resolvers.sonatype, Resolvers.scalaSbt)
)

lazy val auth = Project(
    appName + "-auth",
    file("modules/auth")).settings(commonSettings: _*).settings(
      libraryDependencies ++= authDependencies
    )

lazy val main = Project(
    appName,
    file("app")).settings(commonSettings: _*).settings(
      libraryDependencies ++= mainDependencies,
      scalacOptions += "-language:reflectiveCalls"
    ).dependsOn(auth).aggregate(auth)