在sbt中获取对jar程序集路径的引用

时间:2015-07-22 17:52:54

标签: sbt

我使用sbt-izpack构建安装程序。它看起来像bug,其中包文件名的变量未被正确引用。我正在寻找pass in a variable,以便主罐正确包装如下:

variables in IzPack += ("artifactName", artifactFileName.value )

问题是我无法弄清楚如何获取主要工件的路径字符串。 docs表示我可以映射包并获得(Artifact, File)对,如下所示:

val artifactFileName = settingKey[String]("My task.")

artifactFileName :=  {
  val (art, file) = packagedArtifact.in(Compile, packageBin).value
  println("Artifact definition: " + art)
  println("Packaged file: " + file.getAbsolutePath)
  file.getAbsolutePath
}

但是sbt抱怨A setting cannot depend on a task

有没有办法让我能够以某种方式获得主程序集的路径而不需要先生成它(在任务中),以便我可以通过设置传递它?

或者,是否有人在任务中更新提供给izpack的设置?

1 个答案:

答案 0 :(得分:5)

看起来答案在文档中,但它并不明显,因为它在关于修改工件而不是读取其属性的部分中。

来自:http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Artifacts.html#modifying-default-artifacts

  

除了publish-artifact之外,每个内置工件都有几个可配置的设置。基本的是artifact(类型SettingKey[Artifact]),mappings(类型TaskKey[(File,String)])和artifactPath(类型SettingKey[File])。它们的范围是(<config><task>),如上一节所示。

因此,你可以获得artifactPath的字符串值,这是一个设置,因此可以在izPack设置中使用,具有以下内容:

lazy val artifactPathExt = settingKey[String]("Get the main artifact path")
artifactPathExt := (artifactPath in (Compile, packageBin)).value.getPath

虽然我完全忘记了我是如何发生这种情况的,但是人们可能会发现这些信息(某些问题中的可发现性有些问题):

我知道package任务会构建主输出,因此您可以输入:

inspect tree package

在sbt提示符下,显示以下树:

> inspect tree package
[info] compile:package = Task[java.io.File]
[info]   +-compile:packageBin = Task[java.io.File]
[info]     +-compile:packageBin::packageConfiguration = Task[sbt.Package$Conf..
[info]     | +-compile:packageBin::artifactPath = target\scala-2.11\scaladaem..
[info]     | | +-*:scalaBinaryVersion = 2.11
[info]     | | +-*:scalaVersion = 2.11.5

您可以在此处看到package任务需要compile:packageBin::packageConfiguration。您可以在sbt提示符下检查此设置的值。

要在构建中实际抓住这个值,你必须知道如何引用这个东西。您必须找出键,任务和Scopes。您必须知道从configs and tasks获取密钥的“in”语法。最后,您必须知道如何declare and use custom tasks以及如何在运行时引用和声明设置和任务。最后,您必须知道如何使用设置来设置其他设置。

呼。