播放框架2.12;作为生产的一部分运行CLI作业

时间:2013-07-29 19:58:22

标签: scala playframework-2.0 sbt

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

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

我尝试创建自定义sbt任务,但它无权访问 运行时间播放应用程序 防爆。 Build.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 工具并不真正了解播放应用程序。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

以下是我使用MongoDB库的构建plugins.sbt之一的示例。

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"

添加完成后,我可以在Build.scala中导入Embed MongoDB类并调用它们。

你最终可能有3个项目:

  • 核心:大多数应用程序代码
  • webapp:Play耦合应用程序,它取决于核心
  • 任务:sbt任务项目将取决于核心

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

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