23

commonライブラリ プロジェクト (これを と呼びましょう)、Thrift サーバー プロジェクト (これを と呼びましょうserver)、および Play Web アプリケーション プロジェクト (以下 と呼びます) で構成される Scala アプリケーションを作成しようとしていますweb。3 つすべてが Scala で書かれており、sbt でビルドされています。

私のプロジェクト構造は次のようになります。

myproject/
-common/
  ...
-server/
  ...
-web/
  -app/
  -conf/
  ...
-project/
  -Build.scala
  -build.properties
-build.sbt

私のbuild.sbtファイル(少し簡略化)は次のようになります。

import play.Project._

name := "myproject"

version := "1.0-SNAPSHOT"

lazy val common = project

lazy val web = project
    .settings(playScalaSettings: _*)
    .dependsOn(common)

lazy val server = project
    .dependsOn(common)

lazy val root = project.in(file("."))
    .aggregate(common, web, server)

これに関する問題は、ルート プロジェクトが Play プロジェクトではないため、playコマンドが機能しないことです (次のエラーが発生します)。

java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)

SBT ファイルの行のplayScalaSettings後に次の行を挿入すると、ルート プロジェクトが Play プロジェクトのように見えるようにすることでこれを修正できますが、別の問題があります。コマンドはサブプロジェクトではなくルート プロジェクトを実行しようとします。サブディレクトリで実行すると、プロジェクトとその依存関係を記述する SBT ファイルがないため、明らかにコマンドは機能しません。versionplay runwebplay runweb

このプロジェクト構造を保持できるソリューションを探しています (つまり、Play プロジェクトはアプリケーション内の多くのサブプロジェクトの 1 つです)。同時に、コードが変更されたときのホット アップデートのようなすべての Play フレームワークのホットネス (依存ライブラリのコードも含む) を保持します。のようにcommon)。

play実行して対話型コンソールを取得することで解決策を見つけたと思ったのですが、

 project web
 run

これは機能しますが、コマンド ラインでは機能しません。 play web/run何らかの理由でルートレベルのrunコマンドを実行しますが、ルートアプリケーションは Play アプリケーションではないため、上記のように機能しません。

注: Play Frameworkの Play 2.0 のコンテキストで、SBT Non-Root Module として同様の質問が以前に出されましたが、その答えは満足のいくものではなく、Play 2.2 の時点でもまだ正しいとは思いません。

4

2 に答える 2

15

もしも

 play (entering shell)
 project web
 run

動作する場合は、コマンドラインから動作させることができます:

 play "project web" "run"

シェルでできることはすべてコマンドラインで実行できます。

私は同じプロジェクト構造を持っていますが、それは私にとってうまくいく方法です。

ちなみにホットリロードはPlayと関係ないと思います。Play で使用される SBT が提供するインクリメンタル コンパイルです。play コマンドは、ハッキングされた SBT ランチャーだと思います。

次のコマンドは私にとってはうまくいきます:

 sbt "project web" "run"

そしてホットリロードで Play プロジェクトを起動します。


私はあなたも使うことができると思います

 sbt "project web" "~run"

ブラウザの更新を待つのではなく、ソースファイルを変更するたびに再コンパイルを試み、しばらくの間勝利します。

于 2013-09-24T08:17:56.143 に答える
0

これは Play 2.2 のバグだと思うので、 web/run として実行するとエラー " / :playRunHooks is undefined"として報告しました。また、2.3.x で修正されたようで、2.2 では修正されない可能性があります。ここに私が思いついた少しオタクの回避策があります:

lazy val root = (project in file(".")).
  settings(
    playRunHooks := Nil,
    playInteractionMode := play.PlayConsoleInteractionMode,
    playDefaultPort := 9000,
    playMonitoredFiles := (Def.taskDyn {
      val s = state.value
      s.history.current.split("/").headOption match {
        case Some(ref) =>
          Def.task {
            (playMonitoredFiles in LocalProject(ref)).value
          }
        case _ =>
          Def.task {
            playMonitoredFiles.value
          }
      } 
    }).value
  )
于 2014-12-11T14:54:44.767 に答える