0

我有以下 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>

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

<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-nowAnt 任务运行,例如:

ant -buildfile 导入的.xml 立即运行

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

ant -buildfile importer.xml 构建

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

4

2 回答 2

1

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

运行以下代码,显示属性的“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 ...>来代替。不等于从何而来?你确定问题不在那一行吗?

于 2012-10-13T13:09:44.597 回答
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设置为在命令行上指定的构建文件的路径(或在调用时隐式使用build.xml),但除此之外,Ant 将属性设置ant.file.PROJECTNAME为每个相关构建文件的路径(主要或进口)<project name="PROJECTNAME">。因此${ant.file} == ${ant.file.PROJECTNAME}当且仅当PROJECTNAME是顶级构建文件。

于 2012-10-13T13:19:41.537 回答