如何在访问Play页面时避免激活器执行两次编译任务?

时间:2014-10-23 17:02:32

标签: sbt playframework-2.3 typesafe-activator

我正在尝试在编译Play 2.3应用程序之前运行自定义任务。我在build.sbt文件中有这个:

lazy val helloTask = TaskKey[Unit]("hello", "hello")

helloTask := {
  println("hello test")
}

(compile in Compile) <<= (compile in Compile) dependsOn helloTask

当我运行activator ~run然后在浏览器中打开一个页面时,我得到以下输出:

C:\Development\test>activator ~run
[info] Loading project definition from C:\Development\test\project
[info] Set current project to play (in build file:/C:/Development/test/)

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

hello test
[success] Compiled in 418ms
hello test
hello test
[info] play - Application started (Dev)

我的自定义任务似乎正在运行三次。有没有办法可以避免这种情况?

2 个答案:

答案 0 :(得分:3)

我有同样的问题,我找到了解决方案。

在Sbt中你有三个Scopes by configuration axis

  
      
  • 编译定义主构建(src / main / scala)。
  •   
  • 测试,定义如何构建测试(src / test / scala)。
  •   
  • 运行时定义运行任务的类路径。
  •   

您必须使用运行时而不是编译。它应该是这样的:

lazy val helloTask = taskKey[Unit]("hello")

helloTask := println("hello test")

(compile in Runtime) <<= (compile in Runtime) dependsOn helloTask

答案 1 :(得分:0)

这是google上的第一个结果,所以我想发布我当前对问题的解决方案,该问题实际上适用于play 2.8和多项目构建。略有修改。 @bartholomaios建议的solution会导致我的编译循环。

lazy val helloTask = taskKey[Unit]("hello")
    
helloTask := println("hello test")

lazy val module1: Project = (project in file("modules/module1"))

# Run a task before sbt module1/run
((module1 / run) in Compile) := (((module1 / run) in Compile) dependsOn Compile / helloTask).evaluated

# Run a task before sbt module1/docker:stage
((module1 / stage) in Docker) := (((module1 / stage) in Docker) dependsOn Compile / helloTask).value