【问题标题】:Is there a way to generalize an Apache ANT target?有没有办法概括 Apache ANT 目标?
【发布时间】:2010-09-08 04:08:18
【问题描述】:

我们有一个 Apache ANT 脚本来构建我们的应用程序,然后将生成的 JAR 文件签入版本控制(在本例中为 VSS)。但是,现在我们有一个更改要求我们为此项目构建 2 个 JAR 文件,然后将这两个文件都签入 VSS。

将原始 JAR 文件检查到 VSS 中的当前目标通过某些属性发现 JAR 文件的名称。有没有一种简单的方法来“概括”这个目标,以便我可以重用它来签入具有任何名称的 JAR 文件?在普通语言中,这显然需要一个函数参数,但据我所知,在 ANT 中确实没有等效的概念。

【问题讨论】:

    标签: java build-process build-automation ant


    【解决方案1】:

    我建议使用macros 而不是 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>
    

    重构,“蚂蚁方式”

    【讨论】:

    • 您好像忘记关闭 标签了。应该是&lt;attribute name="file" /&gt;
    【解决方案2】:

    通常认为对二进制文件进行版本控制是个坏主意,我不建议这样做。但是如果你一定要的话,你可以使用 antcall 结合 param 来传递参数和调用一个目标。

    <antcall target="reusable">
        <param name="some.variable" value="var1"/>
    </antcall>
    
    <target name="reusable">
        <!-- Do something with ${some.variable} -->
    </target>
    

    您可以找到有关antcall task here 的更多信息。

    【讨论】:

    • 使用宏而不是 antcall 可能是一个更好的主意(请参阅其他答案)。使用 antcall 你打破了 ant 的依赖机制,很容易得到一些相当混乱的构建日志。
    【解决方案3】:

    看看 Ant macros。它们允许您为 Ant 构建定义可重用的“例程”。您可以找到一个示例 here(第 15 项)。

    【讨论】:

      【解决方案4】:

      还可以查看 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>
      

      【讨论】:

        【解决方案5】:

        您可以使用Gant 为您的构建编写脚本,使用groovy 执行您想要的操作或查看groovy ant task

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-06
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          • 2011-02-12
          相关资源
          最近更新 更多