它们可能是解决这个问题的几种方法,但没有一个像使用 ant-contrib 元素那样简单。我不确定这是否能满足您的应用程序所需,但您可以尝试以下方法:
使用条件目标。如果您可以用要调用的目标替换您的宏定义,这可能对您有用。请注意,这将全局设置属性,因此它可能不适用于您的应用程序。
<target name="default">
<condition property="platformIsProd">
<equals arg1="${platform}" arg2="prod" />
</condition>
<antcall target="do-buildstamp" />
</target>
<target name="do-buildstamp" if="platformIsProd">
<echo>doing prod stuff...</echo>
</target>
处理“其他”情况。 如果您需要处理另一种情况,则需要提供一些目标...
<target name="default">
<property name="platform" value="prod" />
<antcall target="do-buildstamp" />
</target>
<target name="do-buildstamp">
<condition property="platformIsProd">
<equals arg1="${platform}" arg2="prod" />
</condition>
<antcall target="do-buildstamp-prod" />
<antcall target="do-buildstamp-other" />
</target>
<target name="do-buildstamp-prod" if="platformIsProd">
<echo>doing internal prod stuff...</echo>
</target>
<target name="do-buildstamp-other" unless="platformIsProd">
<echo>doing internal non-prod stuff...</echo>
</target>
使用外部构建文件。如果您需要使用不同的属性值进行多次调用,您可以将其隔离在同一项目的另一个构建文件中。这会对性能产生一些影响,但您不需要额外的库。
在 build.xml 中:
<target name="default">
<ant antfile="buildstamp.xml" target="do-buildstamp" />
<ant antfile="buildstamp.xml" target="do-buildstamp">
<property name="platform" value="prod" />
</ant>
<ant antfile="buildstamp.xml" target="do-buildstamp">
<property name="platform" value="nonprod" />
</ant>
</target>
在 buildstamp.xml 中:
<condition property="platformIsProd">
<equals arg1="${platform}" arg2="prod" />
</condition>
<target name="do-buildstamp">
<antcall target="do-buildstamp-prod" />
<antcall target="do-buildstamp-other" />
</target>
<target name="do-buildstamp-prod" if="platformIsProd">
<echo>doing external prod stuff...</echo>
</target>
<target name="do-buildstamp-other" unless="platformIsProd">
<echo>doing external non-prod stuff...</echo>
</target>
将 ant-contrib 添加到您的项目中。当然,如果您可以在项目中添加文件,最简单的方法就是添加 ant-contrib.jar 文件。您可以将其放在“工具”文件夹下并使用 taskdef 将其拉入:
<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/tools/ant-contrib.jar" />