我正在使用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的设置?
答案似乎在文档中,但这并不明显,因为它在有关修改工件而不是读取其属性的部分中。
来自: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。
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |