2016-01-02 79 views

回答

28

我设法通过定义一个自定义sbt任务来工作,该任务在打包应用程序时调用diststage任务。

任务的代码是直截了当:

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 

在开发模式我使用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

我希望这有助于;-)

1

Nouhoum的回答是工作的罚款,直到我更新到SBT 1.0.x的

短短数需要更新:

import scala.sys.process.Process 

lazy val webpack = taskKey[Unit]("Run webpack when packaging the application") 

def runWebpack(file: File) = { 
    Process("npm run build", file) ! 
} 

webpack := { 
    if(runWebpack(baseDirectory.value) != 0) throw new Exception("Something went wrong when running webpack.") 
} 

dist := (dist dependsOn webpack).value 

stage := (stage dependsOn webpack).value