我们有一个 Apache ANT 脚本来构建我们的应用程序,然后将生成的 JAR 文件签入版本控制(在本例中为 VSS)。但是,现在我们有一个更改要求我们为此项目构建 2 个 JAR 文件,然后将这两个文件都签入 VSS。
将原始 JAR 文件检入 VSS 的当前目标通过某些属性发现 JAR 文件的名称。有没有一种简单的方法可以“概括”这个目标,以便我可以重用它来签入任何名称的 JAR 文件?在普通语言中,这显然需要一个函数参数,但据我所知,在 ANT 中确实没有等效的概念。
我们有一个 Apache ANT 脚本来构建我们的应用程序,然后将生成的 JAR 文件签入版本控制(在本例中为 VSS)。但是,现在我们有一个更改要求我们为此项目构建 2 个 JAR 文件,然后将这两个文件都签入 VSS。
将原始 JAR 文件检入 VSS 的当前目标通过某些属性发现 JAR 文件的名称。有没有一种简单的方法可以“概括”这个目标,以便我可以重用它来签入任何名称的 JAR 文件?在普通语言中,这显然需要一个函数参数,但据我所知,在 ANT 中确实没有等效的概念。
我建议使用宏而不是 subant/antcall,因为我发现宏的主要优点是您可以完全控制传递给宏的属性(特别是如果您想添加新属性)。
您只需从目标开始重构您的 Ant 脚本:
<target name="vss.check">
<vssadd localpath="D:\build\build.00012.zip"
comment="Added by automatic build"/>
</target>
创建宏(注意复制/粘贴和替换为@{file}):
<macrodef name="private-vssadd">
<attribute name="file"/>
<sequential>
<vssadd localpath="@{file}"
comment="Added by automatic build"/>
</sequential>
</macrodef>
并使用您的文件调用宏:
<target name="vss.check">
<private-vssadd file="D:\build\File1.zip"/>
<private-vssadd file="D:\build\File2.zip"/>
</target>
重构,“蚂蚁方式”
通常认为对二进制文件进行版本控制是个坏主意,我不建议这样做。但是如果你必须这样做,你可以使用 antcall 结合 param 来传递参数并调用一个目标。
<antcall target="reusable">
<param name="some.variable" value="var1"/>
</antcall>
<target name="reusable">
<!-- Do something with ${some.variable} -->
</target>
您可以在此处找到有关antcall 任务的更多信息。
另请查看 subant 任务,它允许您在多个构建文件上调用相同的目标:
<project name="subant" default="subant1">
<property name="build.dir" value="subant.build"/>
<target name="subant1">
<subant target="">
<property name="build.dir" value="subant1.build"/>
<property name="not.overloaded" value="not.overloaded"/>
<fileset dir="." includes="*/build.xml"/>
</subant>
</target>
</project>
您可以使用Gant使用groovy编写构建脚本来执行您想要的操作,或者查看groovy ant 任务。