0

我想自动化 ANT 构建过程以部署应用程序。

我想编写一个 ANT 脚本,它会反复在文件夹中查找 build.xml 文件并运行它们,如果子构建失败,它应该跳过并通过写入日志继续执行其他脚本。任何人都可以发布可以提供帮助的想法或示例。

根文件夹
    |
    |-----文件夹1
    | |
    | |--子文件夹1
    | | 构建.xml
    | |--子文件夹2
    | | 构建.xml
    |-----文件夹2
    | 构建.xml
    |
    |-----文件夹3
             构建.xml
4

2 回答 2

1

我建议使用subant任务

<project name="Subant demo" default="deploy-everything">
    <target name="deploy-everything">
        <subant>
            <fileset dir="." includes="**/build.xml" excludes="build.xml"/>
            <target name="clean"/>
            <target name="deploy"/>
        </subant>
    </target>
</project>

这将找到所有“build.xml”文件并在每个文件上调用“干净部署”目标。

虽然自动拾取子文件夹构建很整洁,但它很少在大型项目中工作,除非构建彼此独立(构建顺序很重要)。

以下示例使用显式文件列表,而不是无序的文件集:

<project name="Subant demo" default="deploy-everything">
    <target name="deploy-everything">
        <subant>
            <filelist dir=".">
                <file name="Folder1/SubFolder1/build.xml"/>
                <file name="Folder1/SubFolder2/build.xml"/>
                ..
            </filelist>
            <target name="clean"/>
            <target name="build"/>
        </subant>
    </target>
</project>

最后,最先进的解决方案是使用像ivy这样的依赖管理器在“ivy.xml”文件中声明每个模块的依赖。正确设置,这使得每个子模块构建更加独立。为了解决构建“一切都只做问题”,ivy 提供了一个构建列表任务,可以自动确定正确的构建顺序:

<target name="deploy-everything">
    <ivy:buildlist reference="build-path">
        <fileset dir="." includes="**/build.xml" excludes="build.xml"/>
    </ivy:buildlist>

    <subant buildpathref="build-path">
        <target name="clean"/>
        <target name="build"/>
    </subant>
</target>
于 2012-12-09T10:45:39.413 回答
0

我已经解决了我的问题,谢谢大家的回复,我使用以下技术来处理这种情况。

<?xml version="1.0" ?> 
<project name="MasterBuildPrj" default="MasterBuild">
    <macrodef name="iterate">
        <attribute name="target"/>
        <sequential>
            <subant target="@{target}">
                <fileset dir="." 
                         includes="**/build.xml"
                         excludes="build.xml"/>
            </subant>
        </sequential>
    </macrodef>
    <target name="MasterBuild"  description="Build all sub projects">
        <iterate target="build"/>
    </target>

    <target name="clean"  description="Clean all sub projects">
        <iterate target="clean"/>
    </target>   
</project>
于 2012-12-09T12:00:03.510 回答