【问题标题】:Ant: set property in 1 file, read it in another?Ant:在一个文件中设置属性,在另一个文件中读取?
【发布时间】:2012-10-13 21:19:41
【问题描述】:

我有以下 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 -buildfileimported.xml 立即运行

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

ant -buildfile importer.xml 构建

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

【问题讨论】:

    标签: java ant ant-contrib


    【解决方案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>
    

    我不熟悉&lt;not-equals arg1="${isRunningFromImporter}" arg2="true"/&gt;。我一直使用&lt;not&gt;&lt;equals ...&gt;。不等于从何而来?你确定问题不在那一行吗?

    【讨论】:

      【解决方案2】:

      您可以使用以下惯用语来自动确定特定构建文件是用户调用的主文件还是已导入:

      <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 构建文件的路径(或者如果它被称为build.xml,则隐式使用),但除此之外,Ant 将属性 ant.file.PROJECTNAME 设置为每个(主要或导入的)&lt;project name="PROJECTNAME"&gt; 的相关构建文件的路径。因此${ant.file} == ${ant.file.PROJECTNAME} 当且仅当PROJECTNAME 是顶级构建文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        • 2013-01-13
        • 1970-01-01
        相关资源
        最近更新 更多