蚂蚁的可用任务

时间:2014-01-20 10:58:05

标签: java xml ant jar ant-contrib

我可以像这样在可用标签中设置变量吗?

<available file="${inf.root}/schema_params/@{componame}-schema.sql" 
   type="file" 
   variable="schema.file" />

因为当我在可用标记中使用property而不是variable时,它的值是不可变的。但我想在运行时更改它.Below是我的代码。我想通过我的组件列表复制1个文件检查。如果文件存在,我必须复制并移动它。否则我必须跳过逻辑。但最新情况是,如果我不使用此代码,

<var name="schema.params.file" unset="true"/>
<property name="schema.params.file" value="false"/>
<var name="scripts.dir" unset="true"/>
<property name="scripts.dir" value="false"/>

在第一次迭代中,如果schema.params.file,scripts.dir在文件存在时设置为true,则即使文件存在doenot,也不会在下一次迭代中覆盖它。所以我已经添加了上面的代码。但现在总是通过上面的代码再次将值设置为false。我怎样才能克服每次迭代中覆盖这两个schema.params.file,scripts.dir的问题?

<for list="${t1.@{componentname}}" param="installableid" delimiter="${line.separator}">
    <sequential>
        <available file="${infinys.root}/schema_params/@{componentname}-schema_params.sql" 
             type="file" 
             property="schema.params.file" />
        <available file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" 
             type="dir" property="scripts.dir"/>
        <if>
            <and>
                <equals arg1="true" arg2="${schema.params.file}" />
                <equals arg1="true" arg2="${scripts.dir}" />  
            </and>                      
            <then>
                <copy file="${infinys.root}/schema_params/@{componentname}-schema_params.sql"
                   todir="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts"
                   failonerror="false" />
                <move file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/@{componentname}-schema_params.sql" 
                      tofile="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/schema_params.sql"
                      failonerror="false"/>
                <chmod file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/schema_params.sql" perm="775"/>
                <var name="schema.params.file" unset="true"/>
                <property name="schema.params.file" value="false"/>
                <var name="scripts.dir" unset="true"/>
                <property name="scripts.dir" value="false"/>  
            </then>
        </if>
    </sequential>
</for>

2 个答案:

答案 0 :(得分:0)

  

我可以像这样在可用标签中设置变量吗?

是的,你可以。

每次迭代都会更改宏名称。 <var/>任务只是一种在Ant中取消设置和重置属性的方法。它是Ant-Contrib项目的一部分。您无需取消设置重置该属性:

<var name="schema.params.file" unset="true"/>
<property name="schema.params.file" value="false"/>

您可以在一个声明中执行此操作:

<var name="schema.params.file" value="false"/>

他们的使用非常气馁,因为它打破了Ant不可改变的财产理念。但是,我发现在通过<var/>循环时,我也经常使用<for/>,有时<macrodef>。较新版本的Ant允许您使用localize属性,因此我怀疑不再需要<var/>任务。

可能使事情变得更容易的另一件事是你可以使用<if/>

<available/>测试
<if>
    <then>
        <and>
            <available file="${infinys.root}/schema_params/@{componentname}-schema_params.sql" 
                type="file"/>
            <available file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" 
                type="dir"/>
        </and>
        <sequencial>
            ....
        </sequential/>
    </then>
</if>

这样做可能会使您的代码更清晰,更易于理解。它还将消除首先取消设置属性的需要。

答案 1 :(得分:-1)

Ant不允许覆盖属性。您仍然可以使用macrodef但这是另一个故事(请参阅How to over-write the property in Ant?) 您可以做的是将周期的内部移动到单独的目标(无法看到为什么将文件复制到另一个位置并立即将其移动到另一个位置,所以我只用一个副本替换了此复制 - 移动)

<target name="cycle-body">
    <available file="${schema.params.file.name}" type="file" property="schema.params.file" />
    <available file="${scripts.dir.name}" type="dir" property="scripts.dir"/>

    <if>
        <and>
            <equals arg1="true" arg2="${schema.params.file}" />
            <equals arg1="true" arg2="${scripts.dir}" />  
        </and>                     
        <then>
            <copy file="${schema.params.file.name}" 
                tofile="${scripts.dir.name}/schema_params.sql" failonerror="false"/>

            <chmod file="${scripts.dir.name}/schema_params.sql" perm="775"/>
        </then>
    </if>
</target>

并将其称为

<for list="${t1.@{componentname}}" param="installableid" delimiter="${line.separator}">
    <antcall target="cycle-body">
        <param name="schema.params.file.name" value="${infinys.root}/schema_params/@{componentname}-schema_params.sql" />
        <param name="scripts.dir.name" value="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" />
    </acntcall>
</for>