获取sbt中jar组装路径的参考

Chr*_*ott 1 sbt

我正在使用sbt-izpack来构建安装程序。好像有一个错误,其中包文件名的变量未正确引用。我希望传递一个变量,以便主jar正确包装为:

variables in IzPack += ("artifactName", artifactFileName.value )
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何获取主工件的路径字符串。该文档说,我可以在地图包,并获得(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
}
Run Code Online (Sandbox Code Playgroud)

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

有没有一种方法可以某种方式获取主装配的路径而无需首先生成它(在任务中),以便可以通过设置将其传递?

或者,是否有某种方式可以更新任务中提供给izpack的设置?

Chr*_*ott 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
Run Code Online (Sandbox Code Playgroud)

虽然我确实忘记了我是如何发生的,但是这是人们可能会发现此信息的方式(sbt的可发现性有些问题):

众所周知,该package任务将构建主要输出,因此您可以输入:

inspect tree package
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

为了真正掌握构建中的这个值,您必须知道如何引用此东西。您必须找出键,任务和范围。您必须知道从配置和任务中获取密钥的“ in”语法。最后,您必须知道如何声明和使用自定义任务,以及如何在运行时引用和声明设置和任务。最后,您必须知道如何使用一个设置来设置另一个设置。

ew。