【问题标题】:Ant - Run a Build.xml for all subdirectoriesAnt - 为所有子目录运行 Build.xml
【发布时间】:2011-05-23 14:19:31
【问题描述】:

我有一个 build.xml 位于顶层,我希望脚本为每个子目录运行一个目标,并将子目录名称作为参数传递给 ANT 目标。

你能帮忙吗?/??

谢谢

【问题讨论】:

  • “脚本”下面是什么意思:bat、sh等?

标签: ant build target


【解决方案1】:

看看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>

这个 sn-p 构建文件将在项目目录的每个子目录中运行 ant,其中可以找到一个名为 build.xml 的文件。在 subant 调用的 ant 项目中,属性 build.dir 的值为 subant1.build。

【讨论】:

    【解决方案2】:

    这可能就是你要找的,

    把它作为你的目标之一放在你的父 build.xml 中

    <target name="executeChildBuild">
    
        <ant antfile="sub1/build.xml" target="build" />
        <ant antfile="sub2/build.xml" target="build" />
    
    </target>
    

    【讨论】:

    • 不完全是,我想要一个顶级 build.xml 遍历所有子目录并在顶级 build.xml 中运行一个目标方法,将子目录名称作为参数。子目录不会有单独的 build.xmls。
    • 你的意思是类似的,伪代码:
    • 我已经取得了一些进展,我想使用 Subant 但有一个问题: 我想在每次运行时设置一个属性,该属性设置为目录名称,有什么想法吗?
    【解决方案3】:

    如果您想在 ant 构建文件中执行此操作,可以使用 Ant Contrib's for task 迭代子目录列表并为每个子目录执行 ant 任务。

    <for param="subdir">
      <dirset dir="${build.dir}">
        <include name="./**"/>
      </dirset>
      <sequential>
        <subant target="${target}">
          <property name="subdir.name" value="@{subdir}"/>
        </subant>
      </sequential>
    </for>
    

    我没有测试这段代码,因为没有安装 ant,但我想它接近你想要做的。

    【讨论】:

    • 我已经取得了一些进展,我想使用 Subant 但有一个问题: 我想在每次运行时设置一个属性,该属性设置为目录名称,有什么想法吗?
    【解决方案4】:

    如果我正确阅读了这个问题,那么这可能就是您要寻找的。

    所以对于你的例子......

    <target name="do-all">
        <antcall target="do-first">
           <param name="dir-name" value="first"/>
           <param name="intented-target" value="init"/>
        </antcall>
        <antcall target="do-first">
            <param name="dir-name" value="second"/>
            <param name="intented-target" value="build"/>
        </antcall>
        <antcall target="do-first">
            <param name="dir-name" value="third"/>
            <param name="intented-target" value="compile"/>
        </antcall>
    </target>
    <target name="do-first">
        <echo>Hello from ${dir-name} ${intented-target}</echo>
        <ant antfile="${dir-name}/build.xml" target="${intented-target}"/> 
    </target>
    

    当你从 Ant 调用这个时,你会在命令行输入这个:

    ant do-all

    你的输出应该是这样的:

    do-all:

    do-first:

    [echo] Hello from first init

    do-first:

    [echo] Hello from second build

    do-first:

    [echo] Hello from third compile

    BUILD SUCCESSFUL Total time: 1 second

    您当然需要确保您用作参数的目录名称确实存在,否则构建将失败。

    您也可以随时通过将值添加到 build.properties 文件来提供要使用的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多