Воспроизведение подпроектов: как конвертировать в 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")
}

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

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

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

2 ответа

Решение

Не нужно срочно конвертировать вашу сборку в 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)

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

если вы используете build.scala, вы используете sbt's Project type и project macro

замещать 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)
Другие вопросы по тегам