Не удается создать ссылку на объект в build.sbt, «ошибка: не найдено: перехваты значений»

#scala #playframework #sbt

#scala #playframework #sbt

Вопрос:

Я пытаюсь добавить gulp в свое игровое приложение, я создал PlayRunHook объект, который должен позволить мне запустить gulp команду, но когда я это делаю, sbt run я получаю сообщение об ошибке, в котором говорится, что не удалось найти объект. Вот мой перехват:

 package hooks

object Gulp extends CommandHook {

  override def beforeStarted(): Unit = {
    exec("gulp")
  }
}
  

А затем в build.sbt :

 lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.7"

scalacOptions   = Seq("-deprecation")

libraryDependencies   = Seq(
  "junit" % "junit" % "4.10" % "test",
  "org.reactivemongo" %% "play2-reactivemongo" % "0.11.14",
  "com.typesafe.play" %% "play" % "2.5.0",
  "com.typesafe.play" %% "play-netty-server" % "2.5.0"
)

PlayKeys.playRunHooks  = hooks.Gulp()
  

Но я получаю:

 build.sbt:18: error: not found: value hooks
PlayKeys.playRunHooks  = hooks.Gulp()
  

Комментарии:

1. Это было полезно, но не то, как я решил свою проблему, я использовал taskKey вместо этого. Я принимаю ваш ответ, поскольку он отвечает на вопрос о том, почему build.sbt не может найти значение hooks (код должен быть в project/ )

Ответ №1:

Вы должны создать Gulp object в project/ каталоге, как показано ниже:

 import play.sbt.PlayRunHook
import sbt._

object Gulp {
  def apply(base: File): PlayRunHook = {

    object GulpProcess extends PlayRunHook {

      override def beforeStarted(): Unit = {
        Process("gulp", base).run
      }
    }

    GulpProcess
  }
}
  

Затем в вашем build.sbt :

 PlayKeys.playRunHooks  = Gulp(baseDirectory.value)
  

Для получения более подробной информации ознакомьтесь с этим руководством.

Ответ №2:

Редактировать: В конце концов, я действительно выбрал принятый ответ, этот альтернативный ответ будет запускать вашу gulp bundle команду каждый раз, когда делается запрос к вашему приложению. Используя PlayRunHook подход, вы получаете разные хуки жизненного цикла для подключения, и в конце концов я подключился к beforeStarted (как это сделано в принятом ответе) для запуска gulp watch при запуске приложения.

В дальнейшем я могу изменить это, чтобы это делалось gulp watch в процессе разработки и gulp build при развертывании, хотя я еще не нахожусь на этой стадии.


Принятый ответ объясняет, почему build.sbt не удается найти значение hooks (код должен быть в каталоге project/ ), однако, чтобы решить мою проблему с желанием запускаться gulp bundle во время компиляции, я выбрал это решение:

 import sbt._

// ...

lazy val gulp = taskKey[Unit]("Build frontend assets")
gulp := {
  println("gulp bundle" !!)
}

compile in Compile <<= (compile in Compile).dependsOn(gulp)