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

时间:2018-03-04 12:52:32

标签: scala 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"
}

我有什么建议可以实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

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

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"),而是先前发布的变异副本。

答案 1 :(得分:0)

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

import socket
import psutil

def get_ip_addresses(family):
    for interface, snics in psutil.net_if_addrs().items():
        for snic in snics:
            if snic.family == family:
                yield (interface, (snic.address, snic.netmask))

ipv4s = dict(get_ip_addresses(socket.AF_INET))
macs = dict(get_ip_addresses(psutil.AF_LINK))
mac2ipv4 = {macs[k][0]: ipv4s[k] for k in set(macs) & set(ipv4s)}

print mac2ipv4

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