Ant:在1个文件中设置属性,在另一个文件中读取它?

时间:2012-10-13 12:48:16

标签: java ant ant-contrib

我有以下Ant构建文件importer.xml

<project name="importer" basedir=".." default="build">
    <import file="imported.xml"/>

    <target name="build">
        <!-- Do some stuff... -->

        <property name="isRunningFromImporter" value="true"/>
        <antcall target="run-now"/>
    </target>
</project>

另一个使用ant-contrib任务的构建文件imported.xml

<project name="importer" basedir=".." default="build">
    <!-- Most of file omitted for brevity -->

    <target name="run-now">
        <if>
            <not-equals arg1="${isRunningFromImporter}" arg2="true"/>
            <then>
                <!--
                    This should only execute when the
                    isRunningFromImporter property is not true.
                -->
            </then>
        </if>
    </target>
</project>

imported#run-now目标可以作为独立的Ant任务运行,例如:

  

ant -buildfile imported.xml run-now

在这种情况下,我不希望执行<then>子句/任务。但是,如果您执行的任务与导入importer.xml

的任务相同
  

ant -buildfile importer.xml build

然后我想要执行<then>子句/任务,但是,Ant不允许我在一个文件中查看属性并在另一个文件中读取它。有任何想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

它默认执行您想要的操作。 Antcall的“inheritAll”属性设置为true。

运行以下代码echo的“true”显示该属性实际上已设置。

<project name="importer" basedir=".." default="build">
    <import file="imported.xml"/>

    <target name="build">
        <!-- Do some stuff... -->

        <property name="isRunningFromImporter" value="true"/>
        <antcall target="run-now"/>
    </target>
</project>

<project name="importer" basedir="..">
    <!-- Most of file omitted for brevity -->

    <target name="run-now">

        <echo>${isRunningFromImporter}</echo>
    </target>
</project>

我不熟悉<not-equals arg1="${isRunningFromImporter}" arg2="true"/>。我总是使用<not><equals ...>代替。哪些不等于来自?你确定问题不在那条线上吗?

答案 1 :(得分:0)

您可以使用以下习惯用法自动确定特定构建文件是否是用户调用的主文件或是否已导入:

<project name="projectA">
  <!-- set a property if this file is standalone, don't set it if imported -->
  <condition property="projectA.standalone">
    <equals arg1="${ant.file}" arg2="${ant.file.projectA}" />
  </condition>

  <target name="standalone-only" if="projectA.standalone">
    <echo>I am standalone</echo>
  </target>

  <target name="imported-only" unless="projectA.standalone">
    <echo>I have been imported</echo>
  </target>
</project>

这里的技巧是隐式属性ant.file设置为在命令行中指定的 main 构建文件的路径(如果它被称为{{1,则隐式使用)此外,Ant还将属性build.xml设置为每个(主要或导入的)ant.file.PROJECTNAME的相关构建文件的路径。因此<project name="PROJECTNAME">当且仅当${ant.file} == ${ant.file.PROJECTNAME}是顶级构建文件。