Ответ 1
Мне удалось заставить его работать, указав пользовательскую задачу sbt, которая использует зависимость для dist
и stage
задач, вызываемых при упаковке вашего приложения.
Код задачи прост:
lazy val webpack = taskKey[Unit]("Run webpack when packaging the application")
def runWebpack(file: File) = {
Process("webpack", file) !
}
webpack := {
if(runWebpack(baseDirectory.value) != 0) throw new Exception("Something goes wrong when running webpack.")
}
dist <<= dist dependsOn webpack
stage <<= stage dependsOn webpack
В режиме dev я использую play action hooks для запуска webpack watch
при изменении кода:
PlayKeys.playRunHooks <+= baseDirectory.map(Webpack.apply)
с Webpack
определяется следующим образом:
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() = {
process = Option(
Process("webpack", base).run()
)
}
override def afterStarted(addr: InetSocketAddress) = {
process = Option(
Process("webpack --watch", base).run()
)
}
override def afterStopped() = {
process.foreach(_.destroy())
process = None
}
}
WebpackHook
}
}
Это работает как шарм. Вы найдете на моей учетной записи github образец игры, используя эту технику: https://github.com/nouhoum/play-react-webpack/blob/master/webpack.sbt
Я надеюсь, что это поможет; -)