PlayRunHook在多模块项目中不起作用 [英] PlayRunHook does not work in multi module projects

查看:95
本文介绍了PlayRunHook在多模块项目中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们需要一个基础游戏框架项目,其中包含其他游戏和scala项目作为模块.那些内部独立的项目可以具有不同的javascript框架和构建系统,例如webpack,gulp等.

We need a base play framework projects which contains other play and scala projects as module. Those inner independent projects can have different javascript frameworks and build system like webpack, gulp, etc.

因此,我尝试从 https://www.playframework.com/documentation中尝试PlayRunHook /2.4.x/SBTCookbook .单个项目挂钩按预期工作.但是,无法在多模块项目上正确解决问题.一些代码示例...

So I tried the PlayRunHook from https://www.playframework.com/documentation/2.4.x/SBTCookbook . Single project hooking working as expected. But, unable to get it right on multi module project. Some code samples...

name := """base"""

version := "1.0-SNAPSHOT"

lazy val commonSettings = Seq(
  scalaVersion := "2.11.6",
  libraryDependencies ++= Seq(
    jdbc,
    cache,
    ws,
    specs2 % Test
  ),
  resolvers ++= Seq(
    "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
  )
)

lazy val root = (project in file("."))
        .settings(commonSettings : _*)
        .enablePlugins(PlayScala)
        .dependsOn(scraper)
        .aggregate(scraper)
        .dependsOn(slider)
        .aggregate(slider)

lazy val scraper = (project in file("modules/scraper"))
        .settings(commonSettings : _*)
        .enablePlugins(PlayScala)

lazy val slider = (project in file("modules/slider"))
        .settings(commonSettings : _*)
        .enablePlugins(PlayScala)

routesGenerator := InjectedRoutesGenerator

base/modules/scraper/build.sbt

import play.sbt.PlayImport.PlayKeys.playRunHooks
import WebPack._

name := """scraper"""

version := "1.0-SNAPSHOT"

lazy val frontendDirectory = baseDirectory {_ / "frontend"}

playRunHooks <+= frontendDirectory.map(WebPack.apply)

routesGenerator := InjectedRoutesGenerator

libraryDependencies ++= Seq(
    "com.corundumstudio.socketio" % "netty-socketio" % "1.7.8"
)

resolvers ++= Seq(
    "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
)

base/modules/slider/build.sbt

name := """slider"""

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.6"

routesGenerator := InjectedRoutesGenerator

base/modules/scraper/project/WebPack.scala

import java.net.InetSocketAddress

import play.sbt.PlayRunHook
import sbt._

object WebPack {
    def apply(base: File): PlayRunHook = {
        object WebpackHook extends PlayRunHook {
            var process: Option[Process] = None

            override def beforeStarted(): Unit = {
                if (isWindows) {
                    Process("cmd /c npm run compile", base).run
                } else {
                    Process("npm run compile", base).run
                }
            }

            override def afterStarted(addr: InetSocketAddress): Unit = {
                if (isWindows) {
                    Some(Process("cmd /c npm start", base).run)
                } else {
                    Some(Process("npm start", base).run)
                }
            }

            private def isWindows: Boolean = {
                System.getProperty("os.name").startsWith("Windows")
            }

            override def afterStopped(): Unit = {
                process.foreach(_.destroy())
                process = None
            }
        }

        WebpackHook
    }
}

但是我得到了

...../base/modules/scraper/build.sbt:10: error: not found: object WebPack
import WebPack._
       ^
sbt.compiler.EvalException: Type error in expression
        at sbt.compiler.Eval.checkError(Eval.scala:384)
        at sbt.compiler.Eval.compileAndLoad(Eval.scala:183)
        at sbt.compiler.Eval.evalCommon(Eval.scala:152)
        at sbt.compiler.Eval.evalDefinitions(Eval.scala:122)
        at sbt.EvaluateConfigurations$.evaluateDefinitions(EvaluateConfigurations.scala:271)
        at sbt.EvaluateConfigurations$.evaluateSbtFile(EvaluateConfigurations.scala:109)
        at sbt.Load$.sbt$Load$$loadSettingsFile$1(Load.scala:712)
        at sbt.Load$$anonfun$sbt$Load$$memoLoadSettingsFile$1$1.apply(Load.scala:717)
        at sbt.Load$$anonfun$sbt$Load$$memoLoadSettingsFile$1$1.apply(Load.scala:716)
        at scala.collection.MapLike$class.getOrElse(MapLike.scala:128)
        at scala.collection.AbstractMap.getOrElse(Map.scala:58)
        at sbt.Load$.sbt$Load$$memoLoadSettingsFile$1(Load.scala:716)
        at sbt.Load$$anonfun$loadFiles$1$2.apply(Load.scala:723)
        at sbt.Load$$anonfun$loadFiles$1$2.apply(Load.scala:723)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
        at scala.collection.immutable.List.foreach(List.scala:318)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
        at scala.collection.AbstractTraversable.map(Traversable.scala:105)
        at sbt.Load$.loadFiles$1(Load.scala:723)
        at sbt.Load$.discoverProjects(Load.scala:734)
        at sbt.Load$.discover$1(Load.scala:545)
        at sbt.Load$.discoverAndLoad$1(Load.scala:554)
        at sbt.Load$.loadTransitive(Load.scala:570)
        at sbt.Load$.loadProjects$1(Load.scala:442)
        at sbt.Load$.loadUnit(Load.scala:446)
        at sbt.Load$$anonfun$18$$anonfun$apply$11.apply(Load.scala:281)
        at sbt.Load$$anonfun$18$$anonfun$apply$11.apply(Load.scala:281)
        at sbt.BuildLoader$$anonfun$componentLoader$1$$anonfun$apply$4$$anonfun$apply$5$$anonfun$apply$6.apply(BuildLoader.scala:91)
        at sbt.BuildLoader$$anonfun$componentLoader$1$$anonfun$apply$4$$anonfun$apply$5$$anonfun$apply$6.apply(BuildLoader.scala:90)
        at sbt.BuildLoader.apply(BuildLoader.scala:140)
        at sbt.Load$.loadAll(Load.scala:334)
        at sbt.Load$.loadURI(Load.scala:289)
        at sbt.Load$.load(Load.scala:285)
        at sbt.Load$.load(Load.scala:276)
        at sbt.Load$.apply(Load.scala:130)
        at sbt.Load$.defaultLoad(Load.scala:36)
        at sbt.BuiltinCommands$.doLoadProject(Main.scala:481)
        at sbt.BuiltinCommands$$anonfun$loadProjectImpl$2.apply(Main.scala:475)
        at sbt.BuiltinCommands$$anonfun$loadProjectImpl$2.apply(Main.scala:475)
        at sbt.Command$$anonfun$applyEffect$1$$anonfun$apply$2.apply(Command.scala:58)
        at sbt.Command$$anonfun$applyEffect$1$$anonfun$apply$2.apply(Command.scala:58)
        at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:60)
        at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:60)
        at sbt.Command$.process(Command.scala:92)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.State$$anon$1.process(State.scala:184)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
        at sbt.MainLoop$.next(MainLoop.scala:98)
        at sbt.MainLoop$.run(MainLoop.scala:91)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:70)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:65)
        at sbt.Using.apply(Using.scala:24)
        at sbt.MainLoop$.runWithNewLog(MainLoop.scala:65)
        at sbt.MainLoop$.runAndClearLast(MainLoop.scala:48)
        at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:32)
        at sbt.MainLoop$.runLogged(MainLoop.scala:24)
        at sbt.StandardMain$.runManaged(Main.scala:53)
        at sbt.xMain.run(Main.scala:28)
        at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
        at xsbt.boot.Launch$.withContextLoader(Launch.scala:128)
        at xsbt.boot.Launch$.run(Launch.scala:109)
        at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
        at xsbt.boot.Launch$.launch(Launch.scala:117)
        at xsbt.boot.Launch$.apply(Launch.scala:18)
        at xsbt.boot.Boot$.runImpl(Boot.scala:41)
        at xsbt.boot.Boot$.main(Boot.scala:17)
        at xsbt.boot.Boot.main(Boot.scala)
[error] sbt.compiler.EvalException: Type error in expression
[error] Use 'last' for the full log.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?

我正在试验游戏框架,对此我还很陌生.预先感谢

I am experimenting play framework, and I am fairly new to this. Thanks in advance

推荐答案

  1. 在sbt中仅保留一个build.sbt文件和一个project目录(带有* .sbt和* .scala配置文件)
  2. WebPack.scala复制到project目录.
  3. 将您的根项目移至子项目(基础).
  4. 重写build.sbt
  1. In sbt keep only one build.sbt file and one project directory (with *.sbt and *.scala config files)
  2. Copy WebPack.scala to project directory.
  3. Move your root project to subproject (base).
  4. Rewrite build.sbt

    import play.sbt.PlayImport.PlayKeys.playRunHooks

    name := """root"""

    version := "1.0-SNAPSHOT"

    val scraperDir = "modules/scraper"

    val sliderDir = "modules/slider"

    lazy val commonSettings = Seq(
        scalaVersion := "2.11.7",
        libraryDependencies ++= Seq(
           jdbc,
           cache,
           ws,
           specs2 % Test
        ),
        resolvers ++= Seq(
           "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
        )
    )

    lazy val base = projectName("base","base").settings(
        playRunHooks += WebPack.apply(file(scraperDir))
    )
   .dependsOn(scraper,slider)

    lazy val scraper = projectName("scraper", scraperDir).settings(
       libraryDependencies ++= Seq(
           "com.corundumstudio.socketio" % "netty-socketio" % "1.7.8"
       ),
       resolvers ++= Seq(
          "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots")
    )

    lazy val slider = projectName("slider", sliderDir)

    def projectName(name: String, path: String): Project =
     Project(name,file(path))
     .settings(
         commonSettings,
         routesGenerator := InjectedRoutesGenerator
     )
     .enablePlugins(PlayScala)

这篇关于PlayRunHook在多模块项目中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆