Play子项目:如何转换为build.sbt

9

我有一个正在运行的多模块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。此方法是在版本 2.2 之前定义 Play 应用程序的方式。为了支持向后兼容性,保留该方法。我们建议您转换为基于 build.sbt 的方法,或者如果使用 build.scala,则使用 sbt 的 Project 类型和 project 宏。
是否有任何有效的示例,描述如何使用 build.sbt 替换 project/build.scala?我在这里和那里读了一些简短的文章...但是我无法获得一个可用的 Play 项目。
2个回答

9
没有紧急的需要将您的构建转换为build.sbtbuild.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中,放置您的身份验证模块的设置:

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)

无论如何,它可能需要一些微调,但希望你能理解重点。

1
如果使用 build.scala,您需要使用 sbt 的 Project 类型和 project 宏。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接