【问题标题】:How to invoke npm via sbt in a multi-module project如何在多模块项目中通过 sbt 调用 npm
【发布时间】:2016-01-04 07:30:46
【问题描述】:

我正在使用 sbt 构建一个多模块项目。其中一个模块是使用 npm 构建的 JavaScript 应用程序。我想通过 shell 脚本简单地执行 npm 作为包任务的一部分,并将生成的输出文件用作该模块的工件。我可以将 shell 命令作为打包任务的一部分运行,但由于某种原因,当我运行 publish 或 publishLocal 时,此任务会被忽略。

附件是我的 Build.scala。

它是应使用 npm 构建的 accounts-ui 项目。现在实际的 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)

}

【问题讨论】:

    标签: sbt


    【解决方案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[File],使用 packageBin 密钥,并将任务替换为

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2015-11-10
      • 2020-06-27
      相关资源
      最近更新 更多