2013-07-29 41 views
2

我有Rails體驗,但我是Scala/Play新手。 我正在構建一個簡單的Play應用程序。它自然有一個內置的Web UI。Play框架2.12;作爲生產的一部分運行CLI作業

我需要的一件事是一個簡單的管理CLI工具。它需要能夠在生產環境中運行,以執行各種任務,例如導入用戶名。這可能類似於Rails Rake, ,因爲代碼可以利用大部分Play應用程序堆棧。它需要能夠使用Play應用程序中定義的數據庫。

我試着創建一個自定義的sbt任務,但它沒有訪問 運行時間播放應用程序。例子:
Ex。 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() 
} 

我無法使用這種技術訪問數據庫。我想這是因爲這個工具並不真正瞭解這個應用程序。

可以指向正確的方向嗎?

回答

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內嵌入MongoDB的類和調用它們。

你可能最終有3個項目:

  • 核心:你的大部分應用程序代碼
  • Web應用程序:播放結合的應用程序,這將取決於核心
  • 任務:SBT任務項目,該項目將依賴核心

這意味着您應該創建一個不應該與Play結合的核心項目。這裏有一些工作要做。

另一個想法可能會在您的web應用程序中創建一個帶有一些按鈕的小型後臺來運行任務。這是一個短期解決方案,我認爲所有這些任務都不應該在同一個JVM中運行,因爲它們可能需要不同的調整,並且不會減慢生產代碼的速度......但我認爲Play模塊或插件可以幫助解決這個問題。

+0

「因此,在構建定義的任務中訪問它會很奇怪」 - 我完全同意;這聞起來不好:( – seand

+0

我比較這一點與Rails,你可以有一個。rb腳本通過簡單地調用require_relative'../config/environment'來加載Rails堆棧。也許這不僅僅是實際的做到這一點。 – seand

+0

我在這裏問了一個非常類似的問題:http://stackoverflow.com/questions/17954154/use-sbt-to-launch-an-applicative-task-batch因爲我需要這樣的東西。我認爲它可以正常工作 –