【问题标题】:ant 'unless' on a macrodef蚂蚁“除非”在宏定义上
【发布时间】:2012-04-22 04:49:49
【问题描述】:

我想写一个宏定义,它依赖于另一个宏定义中设置的属性,比如这个,它不起作用……(宏定义不支持依赖和除非属性)无论如何要这样做?

<project name="mac">

    <property name="antlr.version" value="3.2"/>

    <macrodef name="check">
        <attribute name="dest"/>
        <attribute name="name"/>
        <attribute name="version"/>
        <sequential>
            <available file="@{dest}/@{name}-@{version}.jar" property="@{name}-exists"/>
        </sequential>
    </macrodef>

    <macrodef name="pull" depends="check" unless="@{name}-exists">
        <attribute name="url"/>
        <attribute name="dest"/>
        <attribute name="name"/>
        <attribute name="version"/>

        <sequential>
            <get src="@{url}" dest="@{dest}/@{name}-@{version}" verbose="true" ignoreerrors="true" unless="@{name}-exists"/>
        </sequential>
    </macrodef>

    <target name="pullall">
           <pull url="http://repo1.maven.org/maven2/org/antlr/antlr/${antlr.version}/antlr-${antlr.version}.jar" dest="." name="antlr" version="${antlr.version}"/>
    </target>

【问题讨论】:

    标签: java ant build dependencies macrodef


    【解决方案1】:

    这似乎有效:

        <project name="mac">
    
            <property name="antlr.version" value="3.2"/>
            <property name="stringtemplate.version" value="4.0.2"/>
    
            <target name="check">
                <available file="${dest}/${name}-${version}.jar" property="jar-exists"/>
            </target>
    
            <target name="_pull" depends="check" unless="jar-exists">
                <get src="${url}" dest="${dest}/${name}-${version}.jar" verbose="true" ignoreerrors="true"/>
            </target>
    
            <macrodef name="pull">
                <attribute name="url"/>
                <attribute name="dest"/>
                <attribute name="name"/>
                <attribute name="version"/>
    
                <sequential>
                    <antcall target="_pull">
                        <param name="url" value="@{url}"/>
                        <param name="dest" value="@{dest}"/>
                        <param name="name" value="@{name}"/>
                        <param name="version" value="@{version}"/>
                    </antcall>
                </sequential>
            </macrodef>
    
            <target name="pullall">
            <pull url="http://repo1.maven.org/maven2/org/antlr/antlr/${antlr.version}/antlr-${antlr.version}.jar" dest="." name="antlr" version="${antlr.version}"/>
            <pull url="http://repo1.maven.org/maven2/org/antlr/stringtemplate/${stringtemplate.version}/stringtemplate-${stringtemplate.version}.jar" dest="." name="stringtemplate" version="${stringtemplate.version}"/>
            </target>
    
    </project>
    

    【讨论】:

    • macrodef 的好处是它可以在外部范围(在目标之前)中使用,这个解决方案没有考虑到这一点。
    【解决方案2】:

    即使这个问题“有点”老了,这可能会对某人有所帮助:

    在 ant 1.9.1 中引入了 if:set unless:set 属性。 https://ant.apache.org/manual/ifunless.html

    这样您就可以按如下方式使用宏(用 ant 1.9.3 测试)

    <project name="mac" xmlns:unless="ant:unless">
    
        <property name="antlr.version" value="3.2"/>
    
        <macrodef name="check">
            <attribute name="dest"/>
            <attribute name="name"/>
            <attribute name="version"/>
            <sequential>
                <available file="@{dest}/@{name}-@{version}.jar" property="@{name}-exists" />
            </sequential>
        </macrodef>
    
        <macrodef name="pull">
            <attribute name="url"/>
            <attribute name="dest"/>
            <attribute name="name"/>
            <attribute name="version"/>
    
            <sequential>
                <check dest="@{dest}" name="@{name}" version="@{version}" />
                <get src="@{url}" dest="@{dest}/@{name}-@{version}.jar" verbose="true" ignoreerrors="true" unless:set="@{name}-exists" />
            </sequential>
        </macrodef>
    
        <target name="pullall">
               <pull url="http://repo1.maven.org/maven2/org/antlr/antlr/${antlr.version}/antlr-${antlr.version}.jar" dest="." name="antlr" version="${antlr.version}"/>
        </target>
    
    </project>
    

    顺便说一句。宏还有其他技巧,if:set/unless:set 也有,请参阅此处http://www.artificialworlds.net/blog/2013/09/13/using-ifset-unlessset-etc-with-macrodefs-in-ant/

    如果您将 if/unless 添加到宏的顺序主体中,您甚至可以模拟条件宏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多