如何使用一个构建文件在 Ant 中构建多个项目?

2022-09-03 14:40:42

我可以从一个构建文件构建多个项目吗?例:

<project basedir="." default="all" name="app1">
    ...
</project>

<project basedir="." default="all" name="app2">
    ...
</project>

目前,我键入并构建我的应用程序,我必须使用两个单独的构建文件。有没有办法让它以一种方式运行,我已经让两个项目都定义了一个通用的构建文件,我可以键入类似或的东西?ant -f build1.xml compileant app1 compileant app2 compile

以下是我的构建文件的外观:

<?xml version="1.0" encoding="UTF-8"?>
<project name="azebooster" default="dist" basedir=".">

    <!-- Globals -->
    <property name="src" location="src/com/aelitis"/>
    <property name="build" location="build/azebooster"/>
    <property name="jar" location="jar/azebooster"/>
    <property name="resources" location="res/azebooster"/>

    <!-- Paths -->
    <path id="classpath">
        <fileset dir="." includes="**/*.jar"/>
    </path>

    <!-- Start it -->
    <target name="init">
      <tstamp/>
      <mkdir dir="${build}"/>
      <mkdir dir="${jar}"/>
    </target>

    <!-- Build it -->
    <target name="compile" depends="init" description="compile the source" >
        <javac srcdir="${src}" destdir="${build}">
            <classpath>
                <path refid="classpath"/>
            </classpath>
        </javac>
    </target>

    <!-- Jar it -->
    <target name="jar" depends="compile">
        <jar destfile="${jar}/${ant.project.name}.jar">
            <fileset dir="${build}"/>
            <fileset dir="${resources}" />
        </jar>
    </target>

    <!-- Clean it -->
    <target name="clean" description="clean up" >
        <tstamp/>
        <delete dir="${build}"/>
        <delete dir="${jar}"/>
    </target>

</project>

谢谢。


答案 1

是的,您可以创建 default.build 文件(这样就不需要指定该文件,因为默认情况下会使用它)。您可以在其上创建以下目标:

<target name="all" depends="app1, app2" />

<target name="app1">
    <ant antfile=<app1file> target="compile" />        
</target>

<target name="app2">
    <ant antfile=<app2file> target="compile" />        
</target>

通过这种方式,您可以从一个唯一的文件中使用两个 ant 文件。

如果您将 app1 和 app2 目标替换为编译它们在单独文件中所需的目标,则可以在一个文件中完成所有操作。

编辑:

您可以通过不同的方法将它们同时包含在一个文件中,也许最简单的方法是为每个目标上的每个项目添加一个后缀。您可以调用特定的项目目标或两者的目标。

我给你一个编译目标的例子(以及初始化目标)。

您可以使用编译来编译两个项目(我将另一个项目称为其他项目),并使用compileazeboster来编译azeboser项目。

您可以搜索常见内容以避免不必要的重复代码(公共路径,目标等)

<property name="srcazebooster" location="src/com/aelitis"/>
<property name="buildazebooster" location="build/azebooster"/>
<property name="jarazebooster" location="jar/azebooster"/>
<property name="srcother" location="src/other"/>
<property name="buildother" location="build/other"/>
<property name="jarother" location="jar/other"/>


<!-- Start it -->
<target name="init" depends="initazebooster, initother"/>

<!-- Build it -->
<target name="compile" depends="compileazebooster, compileother" description="compile the source for all" />



<!-- Start azebooster-->
<target name="initazebooster">
    <tstamp/>
    <mkdir dir="${buildazebooster}"/>
    <mkdir dir="${jarazebooster}"/>
</target>

<!-- Build azeboster-->
<target name="compileazebooster" depends="initazebooster" description="compile the source for azebooster" >
    <javac srcdir="${srcazebooster}" destdir="${buildazebooster}">
        <classpath>
            <path refid="classpath"/>
        </classpath>
    </javac>
</target>

<!-- Start other-->
<target name="initother">
    <tstamp/>
    <mkdir dir="${buildotherr}"/>
    <mkdir dir="${jarother}"/>
</target>

<!-- Build other-->
<target name="compileother" depends="initother" description="compile the source for other" >
    <javac srcdir="${srcother}" destdir="${buildother}">
        <classpath>
            <path refid="classpath"/>
        </classpath>
    </javac>
</target>

答案 2

您可能能够使用宏执行所需的操作(尽管这完全取决于两个项目之间的共同点),尽管您的命令更有可能

ant compile app1

ant compile app2

其中编译是调用宏的目标,使用 app1/app2 作为参数来决定调用哪个宏或传递到宏本身。


推荐