PlayRunHook在多模块项目中不起作用

编程入门 行业动态 更新时间:2024-10-26 22:23:12
本文介绍了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.

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

So I tried the PlayRunHook from www.playframework/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 "dl.bintray/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 "oss.sonatype/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.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._ ^ sbtpiler.EvalException: Type error in expression at sbtpiler.Eval.checkError(Eval.scala:384) at sbtpiler.EvalpileAndLoad(Eval.scala:183) at sbtpiler.Eval.evalCommon(Eval.scala:152) at sbtpiler.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] sbtpiler.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

推荐答案

  • 在sbt中仅保留一个build.sbt文件和一个project目录(带有* .sbt和* .scala配置文件)
  • 将WebPack.scala复制到project目录.
  • 将您的根项目移至子项目(基础).
  • 重写build.sbt
  • In sbt keep only one build.sbt file and one project directory (with *.sbt and *.scala config files)
  • Copy WebPack.scala to project directory.
  • Move your root project to subproject (base).
  • 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 "dl.bintray/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 "oss.sonatype/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在多模块项目中不起作用

    本文发布于:2023-11-26 17:37:39,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1634534.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:中不   多模   项目   PlayRunHook

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!