如何使用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修改默认工件的内容的主要内容,如果未能解决你的问题,请参考以下文章