§sbt 食谱
§连接到 Play 的开发模式
当 Play 在开发模式下运行时,即使用 sbt run
时,通常需要连接到它以启动开发所需的额外进程。这可以通过定义一个 PlayRunHook
来完成,它是一个具有以下方法的特征
beforeStarted(): Unit
- 在 Play 应用程序启动之前调用,但在所有“运行前”任务完成后调用。afterStarted(): Unit
- 在 Play 应用程序启动后调用。afterStopped(): Unit
- 在 Play 进程停止后调用。
现在假设您想在应用程序启动之前使用 grunt
构建一个 Web 应用程序。首先,您需要在 project/
目录中创建一个 Scala 对象以扩展 PlayRunHook
。让我们将其命名为 Grunt.scala
import play.sbt.PlayRunHook
import sbt._
import scala.sys.process.Process
object Grunt {
def apply(base: File): PlayRunHook = {
object GruntProcess extends PlayRunHook {
override def beforeStarted(): Unit = {
Process("grunt dist", base).run
}
}
GruntProcess
}
}
现在您可以在 build.sbt
中注册此钩子
PlayKeys.playRunHooks += Grunt(baseDirectory.value)
这将在每次运行 sbt run
时,在应用程序启动之前在 baseDirectory
中执行 grunt dist
命令。
现在我们想要修改我们的运行钩子,以便在发生更改时执行grunt watch
命令来观察更改并重建 Web 应用程序,因此我们将修改之前创建的Grunt.scala
文件
import play.sbt.PlayRunHook
import sbt._
import java.net.InetSocketAddress
import scala.sys.process.Process
object Grunt {
def apply(base: File): PlayRunHook = {
object GruntProcess extends PlayRunHook {
var watchProcess: Option[Process] = None
override def beforeStarted(): Unit = {
Process("grunt dist", base).run
}
override def afterStarted(): Unit = {
watchProcess = Some(Process("grunt watch", base).run)
}
override def afterStopped(): Unit = {
watchProcess.map(p => p.destroy())
watchProcess = None
}
}
GruntProcess
}
}
现在,当使用sbt run
启动应用程序时,将执行grunt watch
,以便在文件更改时重新运行 grunt 构建。
§添加编译器选项
例如,您可能希望添加功能标志以了解有关功能警告的详细信息
[info] Compiling 1 Scala source to ~/target/scala-2.10/classes...
[warn] there were 1 feature warnings; re-run with -feature for details
只需将-feature
添加到scalacOptions
属性中
scalacOptions += "-feature"
§添加其他资产目录
例如,您可以添加pictures
文件夹作为其他资产目录
Assets / unmanagedResourceDirectories += baseDirectory.value / "pictures"
这将允许您使用此文件夹的routes.Assets.at
。
§配置外部化资源
从 Play 2.4 开始,默认情况下会将conf
目录的内容添加到类路径中。
当打包用于生产的 Play 应用程序时,该conf
文件夹(或其内容)可能存在于两个地方
要么conf
文件夹不会被打包到jar
文件中(与应用程序的其余部分一起),而是保留在文件系统上的该jar
文件外部。因此,该conf
文件夹的内容(例如application.conf
)可以被编辑,并且通过重新启动应用程序,任何更改都会立即被拾取 - 无需重新打包和重新部署应用程序。这是默认设置。
或者,Play 可以被配置为始终将conf
文件夹的内容放入应用程序jar
文件中。这可以通过设置来完成
PlayKeys.externalizeResources := false
在build.sbt
中。有时,这种行为对于某些库需要conf
文件夹的(某些)资源和应用程序类文件位于同一个jar
文件中才能正常工作的情况是必要的。
从 Play 2.7 开始,存在另一个配置键,允许您排除特定的资源,以便它们不会被外部化,即使当PlayKeys.externalizeResources := true
时也是如此
PlayKeys.externalizeResourcesExcludes += baseDirectory.value / "conf" / "somefolder" / "somefile.xml"
由于这个配置键,您不再需要将conf
文件夹的所有文件都放入jar
文件中,而这只需要针对某些特定文件。
§禁用文档
为了加快编译速度,您可以禁用文档生成
Compile / doc / sources := Seq.empty
Compile / packageDoc / publishArtifact := false
第一行将禁用文档生成,第二行将避免发布文档工件。
§配置 ivy 日志级别
默认情况下,ivyLoggingLevel
设置为UpdateLogging.DownloadOnly
。您可以使用以下方法更改此值
UpdateLogging.Quiet
只显示错误UpdateLogging.Full
记录了最多的
例如,如果您只想显示错误
ivyLoggingLevel := UpdateLogging.Quiet
§测试中的分叉和并行执行
默认情况下,并行执行被禁用,而分叉被启用。您可以通过设置 Test / parallelExecution
和/或 Test / fork
来更改此行为。
Test / parallelExecution := true
Test / fork := false
下一步: 调试您的构建
发现此文档中的错误?此页面的源代码可以在 这里 找到。在阅读 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。