2

Rails の経験はありますが、Scala/Play は初めてです。私は単純な Play アプリケーションを構築しています。当然、Web UI が組み込まれています。

必要なものの 1 つは、単純な管理 CLI ツールです。ユーザー名のインポートなどのさまざまなタスクを実行するには、実稼働環境で実行できる必要があります。これは、コードが Play アプリケーション スタックのほとんどを利用できるという意味で、Rails Rake に似たものになります。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 ツールが play アプリケーションについて本当に知らないからだと思います。

私を正しい方向に向けることができますか?

4

1 に答える 1

2

私は SBT の専門家ではありませんが、私の知る限りでは。SBT は Play アプリのコンパイルに使用されるため、まだビルドされていないビルド定義のタスクで SBT にアクセスするのは奇妙です。

データベース構成が 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"

これが追加されると、Embed MongoDB クラスを my 内にインポートしてBuild.scala呼び出すことができます。

最終的に 3 つのプロジェクトを作成できます。

  • core: アプリケーションコードのほとんど
  • webapp: コアに依存する Play 結合アプリケーション
  • tasks: コアに依存する sbt タスク プロジェクト

これは、Play と組み合わせてはならないコア プロジェクトを作成する必要があることを意味します。ここでやるべきことがいくつかあります。

もう 1 つのアイデアは、タスクを実行するためのいくつかのボタンを備えた小さなバックオフィスを Web アプリケーション内に作成することです。これは短期的な解決策です。これらすべてのタスクを同じ JVM 内で実行する必要はないと思います。異なるチューニングが必要になる可能性があり、本番環境のコードを遅くしないためです...しかし、Play モジュールまたはプラグインが役立つと思いますこの問題を解決します。

于 2013-07-29T20:34:51.230 に答える