如何使用SBT修改默认工件的内容

问题描述 投票:1回答:2

我想知道如何修改默认工件,以便为使用SBT发布的工件提供以下结构:

my_artifact.zip
            -config/default.conf
            -my_package.jar

这实际上非常简单。我希望我的最终工件包含这两个并且能够将类型更改为zip。我试图访问默认的工件映射作为下一个没有任何结果:

artifact in (Compile, publish) := {
  val previous: Artifact = (artifact in (Compile, publish)).value
  previous.withName("test_artifact"  + "." + previous.extension)
  previous.withType("zip")
  previous.withExtension("zip")
  previous
}

mappings in packagedArtifact in (Compile, packageBin) += {
  file(s"${baseDirectory.value.getPath}/src/main/config/current.conf") -> "config/current.conf"
}

有什么建议我怎么能实现这个?

scala sbt
2个回答
1
投票

我认为您的代码的问题是您返回的“previous”是不可变的。因此,它确实完成了之前要做的事情,并且您所做的更改将丢失。我能够使用以下代码修改工件

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.4",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "sbtartifact",
    artifact in (Compile, packageBin) := {
       val previous = (artifact in (Compile, packageBin)).value
       previous.withType("bundle").withExtension("bundle")
    },
    libraryDependencies += scalaTest % Test
  )

请注意,我之前没有返回,但previous.withType("bundle").withExtension("bundle")是先前发布的变异副本。


0
投票

在阅读了更多关于SBT之后,我意识到我根本不需要修改工件。实际上我只是通过将sbt-assembly与后期构建任务结合使用来设法更改目录结构:

lazy val postBuild  = taskKey[Unit]("post build")
postBuild := {
  val log = streams.value.log
  val source = (baseDirectory.value / "src/main/config/current.conf")
  val target = baseDirectory.value / "out"/ "config/current.conf"

  log.info(s"Copying ${source.getPath} to ${target.getPath}")
  IO.copyFile(source, target)
  None
}

lazy val finalBuild =  taskKey[Unit]("final build")

finalBuild := {
  Def.sequential(assembly.toTask, postBuild.toTask).value
}

postBuild负责内容修改。在finalBuild中,我执行stb-assembly任务,然后按顺序执行postBuild

© www.soinside.com 2019 - 2024. All rights reserved.