我有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 工具并不真正了解播放应用程序。
可以指出我正确的方向吗?
答案 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个项目:
这意味着您应该创建一个不应与Play结合的核心项目。这里有一些工作要做。
另一个想法可能是在web应用程序内部创建一个小的后台,其中包含一些按钮来运行任务。这是一个短期解决方案,我不认为所有这些任务都应该在同一个JVM中运行,因为它们可能需要不同的调整,而不是减慢生产代码...但我认为Play模块或插件可以帮助解决这个问题。