【问题标题】:Execute selected ant tasks for a selected set of projects为一组选定的项目执行选定的 ant 任务
【发布时间】:2019-07-20 05:01:24
【问题描述】:

我在 ant 中为我们的游戏定义了目标,例如clean、build-ios、build-android、deploy-ios、deploy-android 等。现在我想定义一组新的目标来代表我们的游戏,比如 game1、game2、game3。

我的目标是能够通过一组目标游戏和一组目标任务来启动 ant,以便对于每个选定的游戏,执行每个选定的任务。

示例伪代码:Foreach [game1, game3]: clean, build-ios, deploy-ios

如何使用 ant 实现这一点?一个要求是定义通过目标选择哪些游戏和哪些任务,而不是将它们写入手动更改的文件中。

【问题讨论】:

    标签: build ant


    【解决方案1】:

    subant 任务对于您有多个共享相似结构的子项目的情况很有用。

    在您的主 bu​​ild.xml 中,定义一个在您的游戏子目录中摩擦所需构建目标的目标,以及所有通用构建目标。

    <target name="deploy-all">
        <subant target="deploy">
            <dirset dir="." includes="game-*" />
        </subant>
    
        <echo message="All games deployed." />
    </target>
    
    <target name="deploy" depends="deploy-ios,deploy-android">
        <echo message="${ant.project.name} build complete." />
    </target>
    
    <target name="clean">
        <echo message="Cleaning ${ant.project.name}" />
    </target>
    
    <target name="build-ios" depends="clean">
        <echo message="Building iOS ${ant.project.name}" />
    </target>
    
    <target name="build-android" depends="clean">
        <echo message="Building Android ${ant.project.name}" />
    </target>
    
    <target name="deploy-ios" depends="build-ios">
        <echo message="Deploying iOS ${ant.project.name}" />
    </target>
    
    <target name="deploy-android" depends="build-android">
        <echo message="Deploying Android ${ant.project.name}" />
    </target>
    

    然后,在 game-* 子目录中,创建一个简单的 build.xml 链接回通用文件。

    game-1/build.xml:

    <project name="game-1" default="build">
        <import file="../build.xml" />
    
        <echo message="=== Building Game 1 ===" />
    </project>
    

    game-2/build.xml:

    <project name="game-2" default="build">
        <import file="../build.xml" />
    
        <echo message="=== Building Game 2 ===" />
    </project>
    

    编辑:如果您的构建需要根据用户的输入或预定义的属性包含/排除某些子项目,您可以修改subant 任务的嵌套资源集合以适应此情况。

        <property name="game.includes" value="game-*" />
        <property name="game.excludes" value="" />
    
        <subant target="deploy">
            <dirset dir="." includes="${game.includes}" excludes="${game.excludes}" />
        </subant>
    

    然后,用户可以运行一个命令,该命令可选择传递game.includes 和/或game.excludes 的值。如果未指定这些属性,则上面由property 任务定义的值将用作默认值。

    【讨论】:

    • 谢谢,这有帮助。尽管我仍然无法轻松地选择要运行任务的众多游戏中的哪一个。如果我理解你的例子是正确的,你建议创建一个 subant 来构建所有游戏,但我的目标是只构建选定的游戏。我想我可以创建子任务来结合每一个目标和游戏,但这需要大量的写作。有没有更简单的方法来告诉 ant 构建目标“部署”,但仅限于选定的游戏,而不是所有游戏?比如说,选择我想要包含哪些子构建文件,而不是包含 game-*..?谢谢
    • Subant 迭代资源集合(在本例中为一组目录),因此如果您想选择构建哪些子项目,可以使用该资源集合的包含和排除。我将编辑答案以显示示例。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2011-07-03
    • 2016-05-15
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多