2015-10-07 58 views
2

我正在使用sbt構建多模塊項目。其中一個模塊是一個使用npm構建的JavaScript應用程序。我想簡單地通過shell腳本執行npm作爲包任務的一部分,並使用生成的輸出文件作爲該模塊的工件。我能夠運行shell命令作爲程序包任務的一部分,但由於某些原因,當我運行publish或publishLocal時,將忽略此任務。如何在多模塊項目中通過sbt調用npm

附加的是我的Build.scala。

這是accounts-ui項目,應該使用npm構建。現在,實際的npm構建由一個簡單的腳本表示。

import sbt._ 
import Keys._ 
import play.Play.autoImport._ 
import PlayKeys._ 
import play.PlayScala 
import sbtassembly._ 
import AssemblyKeys._ 
import net.virtualvoid.sbt.graph.Plugin.graphSettings 
import ohnosequences.sbt.SbtS3Resolver.autoImport._ 

object Build extends Build { 

    lazy val commonSettings = Seq(
    organization := "myorg", 
    scalaVersion := "2.11.5" 
) 

    lazy val publishSettings = Seq(
    publishTo := { 
     val prefix = if (isSnapshot.value) "snapshots" else "releases" 
     Some(s3resolver.value("MyOrg " + prefix + " S3 bucket", s3(prefix+".repo.myorg.com"))) 
    } 
) 

    lazy val root = Project(id = "root", base = file(".")).settings(commonSettings).settings(
    name := "accounts-root" 
).settings(publishSettings).aggregate(api, ui) 

    val _apiName = "accounts-api" 

    lazy val api = Project(id = "api", base = file("./api")).settings(commonSettings).settings(
    name := "accounts-api", 
    libraryDependencies ++= Seq(
     specs2 
    ) 
).settings(publishSettings).settings(graphSettings).settings(
    mainClass in assembly := Some("play.core.server.NettyServer"), 
    fullClasspath in assembly += Attributed.blank(PlayKeys.playPackageAssets.value), 
    test in assembly := {}, 
    assemblyExcludedJars in assembly := { 
     val cp = (fullClasspath in assembly).value 
     cp filter { (el) => { 
      val name = el.data.getName 
      name.contains("mockito") || name.contains("commons-logging") || name.contains("specs2") 
     } 
     } 
    } 
).settings(addArtifact(Artifact(_apiName, "assembly"), assembly) 
).enablePlugins(PlayScala) 

    val npmBuildTask = taskKey[Unit]("some custom task") 

    lazy val ui = Project(id = "ui", base = file("./ui")).settings(commonSettings).settings(
    name := "accounts-ui", 
    npmBuildTask := { 
     val processBuilder = Process("npm-build.sh") 
     val process = processBuilder.run() 
     if(process.exitValue() != 0) 
     throw new Error(s"custom task failed with exit value ${process.exitValue()}") 
    }, 
    Keys.`package` <<= (Keys.`package` in Compile) dependsOn npmBuildTask 
).settings(publishSettings) 

} 

回答

1

我能解決這個問題如下:

val npmPackageTask = taskKey[File]("npm package task") 

    lazy val ui = Project(id = "ui", base = file("./ui")).settings(commonSettings).settings(
    name := "accounts-ui", 
    npmPackageTask := { 
     val processBuilder = Process("npm-build.sh") 
     val process = processBuilder.run() 
     if(process.exitValue() != 0) 
     throw new Error(s"custom task failed with exit value ${process.exitValue()}") 
     file(".") 
    }, 
    packageBin in Compile <<= npmPackageTask 
).settings(publishSettings) 

的關鍵是創建密鑰taskKey [文件],使用packageBin鍵,並更換與< <任務=運營商。

相關問題