2

我有 Rails 经验,但我是 Scala/Play 的新手。我正在构建一个简单的 Play 应用程序。它自然有一个内置的 Web UI。

我需要一个简单的管理 CLI 工具。它需要能够在生产环境中运行以执行各种任务,例如导入用户名。它类似于 Rails Rake,因为代码可以利用大部分 Play 应用程序堆栈。它需要能够使用 Play 应用程序中定义的数据库。

我尝试创建自定义 sbt 任务,但它无权访问运行时播放应用程序。
前任。构建.scala

val sample_tsk = TaskKey[Unit]("sample_tsk", "Prints 'Hello World'")
val sampleTask = sample_tsk := {
  println("Hello World2")    

  // this doesn't work.
  import play.api.db._
  import play.api.Play.current            
  println("About to get connection...")
  val conn = DB.getConnection()
}

我无法使用这样的技术访问数据库。我认为这是因为 sbt 工具并不真正了解播放应用程序。

可以指出我正确的方向吗?

4

1 回答 1

2

我根本不是 SBT 专家,但据我所知。SBT 用于编译 Play 应用程序,因此在尚未构建时在构建定义的任务中访问它会很奇怪。

如果您的数据库配置在 Play 配置文件中,那么您的应用程序配置与 Play 框架耦合。我认为很难绕过这种耦合并能够在 SBT 任务中重用应用程序的某些应用程序代码。

但是,如果您的应用程序与 Play 不耦合,您最终可以为您的任务创建另一个 SBT 项目。在此项目中,您可以向构建脚本添加依赖项。

plugins.sbt这是我的一个使用 MongoDB 库的构建示例。

resolvers ++= Seq(
    DefaultMavenRepository,
    Resolver.url("Play", url("http://download.playframework.org/ivy-releases/"))(Resolver.ivyStylePatterns),
    "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"
)

addSbtPlugin("play" % "sbt-plugin" % "2.1.2")

libraryDependencies += "de.flapdoodle.embed" % "de.flapdoodle.embed.mongo" % "1.28"

添加后,我可以在我的内部导入 Embed MongoDB 类Build.scala并调用它们。

你最终可能有 3 个项目:

  • 核心:您的大部分应用程序代码
  • webapp:将依赖于核心的 Play 耦合应用程序
  • 任务:将依赖于核心的 sbt 任务项目

这意味着您应该创建一个不应与 Play 耦合的核心项目。这里有一些工作要做。

另一个想法可能是在您的 web 应用程序中创建一个带有一些按钮来运行任务的小型后台。这是一个短期解决方案,我不认为所有这些任务都应该在同一个 JVM 中运行,因为它们可能需要不同的调整,并且不会减慢您的生产代码......但我认为 Play 模块或插件可以帮助解决这个问题。

于 2013-07-29T20:34:51.230 回答