scala - Play Framework 2.12;作为生产的一部分运行 CLI 作业

标签 scala playframework-2.0 sbt

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

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

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

能给我指出正确的方向吗?

最佳答案

据我所知,我根本不是 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"

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

您最终可能有 3 个项目:

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

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

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

关于scala - Play Framework 2.12;作为生产的一部分运行 CLI 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933056/

相关文章:

scala - Scala 中的类型定义

java - android scala eclipse 插件的 searchView 小部件中的过滤方法

scala - 如何在 sbt 中声明一个子项目上的命令依赖于另一个子项目中的命令?

scala - 为什么 sbt 一直告诉我添加 -deprecation 到 scalacOptions ?

apache-spark - 玩!和Spark不兼容的Jackson版本

scala - 如何使用 sbt-docker 或手动编写 docker 文件在 docker 中运行 sbt 项目?

scala - A类具有一个类型参数,而B类型具有一个类型参数

java - 在 Play Framework 2.0 中测试异步 Web 服务调用

scala - 为什么测试方法失败?

html - 如何在 Play Framework 中使用 Groovy 对非转义 HTML 字符进行子串