【问题标题】:Play framework 2.12; running CLI jobs as part of production播放框架2.12;在生产过程中运行 CLI 作业
【发布时间】:2013-07-29 19:58:22
【问题描述】:

我有 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 工具并不真正了解播放应用程序。

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

【问题讨论】:

    标签: scala playframework-2.0 sbt


    【解决方案1】:

    据我所知,我根本不是 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 中导入 Embed MongoDB 类并调用它们。

    你最终可能有 3 个项目:

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

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

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

    【讨论】:

    • “所以在构建定义的任务中访问它会很奇怪”——我完全同意;这闻起来很糟糕:(
    • 我将其与 Rails 进行了一些比较,在 Rails 中,您可以通过对 require_relative '../config/environment' 的简单调用让 .rb 脚本加载 Rails 堆栈。也许在这里这样做不仅实用。
    • 我在这里问了一个非常相似的问题:stackoverflow.com/questions/17954154/… 因为我需要这样的东西。我认为它可以正常工作
    • 我不认识瑞克。我昨天阅读了整个 SBT 入门指南,我认为此页面可以帮助您:scala-sbt.org/release/docs/Getting-Started/Using-Plugins(+ 阅读有关 SBT 项目递归性的页面)
    猜你喜欢
    • 2018-04-15
    • 1970-01-01
    • 2018-03-25
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多