Scala SBT如何发布从run命令生成的工件

Scala SBT如何发布从run命令生成的工件,scala,sbt,publish,Scala,Sbt,Publish,我试图编译并运行scala代码,该代码在SBT中生成一个文件(在本例中是一个招摇过市的文件) 以下sbt执行良好。构建并执行jar,执行创建的swagger.zip文件位于目标目录中。然而,我似乎无法像我的标准jar文件那样将zip文件发布到我的artifactory repo 知道我遗漏了什么吗 publishArtifact in (Compile, packageBin) := false publishArtifact in run := true val

我试图编译并运行scala代码,该代码在SBT中生成一个文件(在本例中是一个招摇过市的文件)

以下sbt执行良好。构建并执行jar,执行创建的swagger.zip文件位于目标目录中。然而,我似乎无法像我的标准jar文件那样将zip文件发布到我的artifactory repo

知道我遗漏了什么吗



    publishArtifact in (Compile, packageBin) := false 
    publishArtifact in run := true

    val myZipTask = taskKey[File]("swagger-zip")

    myZipTask := {
      file("swagger.zip")
    }

    addArtifact(Artifact("swagger", "zip", "zip"), myZipTask )



run
命令不会触发任何发布任务,因为这不是它的用途。我认为您已经尝试在使用“
publishArtifact in run:=true
”调用
run
时打开发布,但该代码不足以实现这一点;您需要将许多其他
任务
附加到该命令。那不是你想要的

您的案例完全符合
addArtifact
helper的预期用途(请参阅和)

由于需要运行代码来生成人工制品,因此应该将该代码作为
Task
参数提供给
addArtifact
帮助程序,即

val myZipTask = taskKey[File]("return the swagger-zip file")
val runZipCodeTask = taskKey[Unit]("run the swagger-zip code")

// See http://www.scala-sbt.org/0.13.2/docs/faq.html, “How can I create a custom run task, in addition to run?”
// and https://stackoverflow.com/questions/23409993/defining-sbt-task-that-invokes-method-from-project-code
fullRunTask(runZipCodeTask, Compile, "ZipGeneratorMainClass")

myZipTask := {
  runZipCodeTask.value
  file("target/swagger/swagger.zip")
}

addArtifact(Artifact("swagger", "zip", "zip"), myZipTask)
然后运行“
sbt publish

工作演示 请参阅,以获取可用的演示

关于作用域的注释——考虑在元项目中生成此文件,而不是主要项目
参见

在myZipTask的定义中,你似乎什么都没做。它应该压缩目标,不是吗?在run命令中执行的代码实际上创建了压缩文件。我想要配置的只是让sbt发布执行创建的工件。生成zip文件的代码就是在“run”命令中执行的代码。在本例中,执行这项工作的代码是生成文件,然后将它们压缩到单个工件中。我不能在sbt中引用代码来执行此操作,因为它需要根据当前项目代码进行构建,以完成它需要完成的工作。@AndrewNorman,我理解,但它不会改变我的答案。您仍然需要编写一个生成zip的任务,并使用“addArtifact”助手将其附加。如果该任务需要调用从您的项目中构建的类,这是绝对正确的,SBT将根据需要整理依赖关系树。您不应该使用“run”命令来执行此操作,而是创建一个具有必要依赖项(即编译类、完整类路径等)的新任务。我会看看是否能在接下来的几天里抽出时间写一个有效的例子,并用更多的细节更新我的答案,但我不能保证任何事情。这是一个破裂的窗口,当涉及到SBT。编写一个Maven插件来满足这些需求非常简单和直观。我认为这个用例实际上在SBT中比在Maven中更容易。您的问题是,您熟悉如何在Maven中实现这一点,但不熟悉SBT。这完全是您的问题,您将不会从SBT中的“坏窗”中得到任何好处。SBT有很多问题,但这不是其中之一。我不同意。Sbt的zip实现是一个非常低级的api。它适用于针对单个文件操作的深层用例。虽然这对于1%的场景来说是一个强大的工具,但它不能解决常见的“99%的时间”场景。本质上,这将是一个简单的“从此目录中的所有内容创建zip文件”单次调用api。虽然可以在涉及多个zip api调用的手写脚本中将某些内容串在一起,但关键是不应该归结到这一点。一个好的“简单构建工具”应该可以为您做到这一点。