【问题标题】:SBT how to publish an artifact generated from the run commandSBT 如何发布从运行命令生成的工件
【发布时间】:2017-08-28 23:45:52
【问题描述】:

我正在尝试编译和运行在 SBT 中生成文件的 scala 代码(在本例中是一个 swagger 文件)。

以下 sbt 执行良好。 jar 被构建并执行,执行创建的 swagger.zip 文件位于目标目录中。但是,我似乎无法像标准 jar 文件那样将 zip 文件发布到我的工件存储库。

知道我缺少什么吗?



    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 )


【问题讨论】:

  • 似乎在 myZipTask 的定义中你什么也没做。它应该压缩目标,不是吗?
  • 在运行命令中执行的代码实际上创建了 zip 文件。我想要配置的只是让 sbt 发布执行创建的工件

标签: scala sbt publish


【解决方案1】:

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

您的案例完全符合addArtifact 助手的预期用法(请参阅the docsthe code

由于您需要运行代码来生成人工制品,您应该将该代码作为 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

工作演示

请参阅https://gist.github.com/RichardBradley/5384a5e0da2427df237f42fe512b30b8 以获得工作演示。

关于范围的注意事项 - 考虑在元项目中生成此文件,而不是在主项目中

https://stackoverflow.com/a/23416018/8261

【讨论】:

  • 生成 zip 文件的代码是在“运行”命令中执行的代码。在这种情况下,执行此工作的代码是生成文件,然后将它们压缩到单个工件中。我不能只引用代码在 sbt 中执行它,因为它需要根据当前项目代码构建才能完成它需要做的工作。
  • @AndrewNorman,我明白,但这不会改变我的答案。您仍然需要编写一个生成 zip 的任务并将其附加到“addArtifact”帮助程序中。如果该任务需要调用从您的项目构建的类,那绝对没问题,SBT 会整理出必要的依赖关系树。您不应该使用“运行”命令来执行此操作,而是创建一个具有必要依赖项的新任务(即编译的类、完整的类路径等)。我会看看我是否可以在接下来的几天里抽出一些时间来写一个有效的例子,并更详细地更新我的答案,但我不能保证任何事情。
  • 这是一个关于 SBT 的破窗。编写一个 Maven 插件来满足这些需求要容易得多和直观
  • 一点也不。我认为这个用例在 SBT 中实际上比在 Maven 中更容易。您的问题是您熟悉如何在 Maven 中执行此操作,但在 SBT 中不熟悉。这完全是你的问题,你不会从 SBT 中的“破窗户”上得到任何好处。 SBT 有很多问题,但这不是其中之一。
  • 我不同意。 Sbt 的 zip 实现是一个非常低级的 api。它适用于针对单个文件操作的深层用例。虽然这对于 1% 的场景来说是一个强大的工具,但它并不能解决常见的“99% 的时间”场景。本质上,这将是一个简单的“从该目录中的所有内容创建一个 zip 文件”单次调用 api。虽然可以在涉及多次调用 zip api 的手写脚本中将某些内容串在一起,但关键是它不应该归结为这一点。一个好的“简单构建工具”应该可以为您做到这一点。
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2011-06-03
相关资源
最近更新 更多