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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用SBT修改默认工件的内容相关的知识,希望对你有一定的参考价值。

我想知道如何修改默认工件,以便为使用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"
}

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

答案

我认为您的代码的问题是您返回的“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")是先前发布的变异副本。

另一答案

在阅读了更多关于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

以上是关于如何使用SBT修改默认工件的内容的主要内容,如果未能解决你的问题,请参考以下文章

本地工件代理背后的 sbt

如何在sbt 1.0.x中发布自定义工件

如何在SBT中发布之前检查工件是否存在

如何构建运行测试套件的 Maven 工件? “sbt 测试”如何工作?

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

SBT:如何在多个任务中重用带有参数的代码?