【问题标题】:available task in antant 中的可用任务
【发布时间】:2014-02-09 12:18:52
【问题描述】:

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

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

因为当我在可用标签中使用属性而不是变量时,它的值是不可变的。但我想在运行时更改它。下面是我的代码。我想通过我的组件列表复制 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,即使文件不存在,它也不会在下一次迭代中被覆盖。所以我添加了上面的代码。但是现在上面的代码总是将这些值再次设置为 false。我怎样才能克服在每次迭代中覆盖这 2 个 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>

【问题讨论】:

    标签: java xml ant jar ant-contrib


    【解决方案1】:

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

    是的,你可以。

    每次迭代都会更改宏名称。 &lt;var/&gt; 任务只是一种在 Ant 中取消设置和重置属性的方法。它是 Ant-Contrib 项目的一部分。你不需要unsetreset属性:

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

    你可以在一个语句中做到这一点:

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

    不鼓励使用它们,因为它破坏了 Ant 的不可变属性理念。但是,我发现我在通过&lt;for/&gt; 循环时也经常使用&lt;var/&gt;,有时还使用&lt;macrodef&gt;。较新版本的 Ant 允许您使用 localize 属性,因此我怀疑很快将不再需要 &lt;var/&gt; 任务。

    另一件可能使事情变得更容易的是,您可以将&lt;if/&gt; 测试与&lt;available/&gt; 一起使用

    <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>
    

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

    【讨论】:

      【解决方案2】:

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        相关资源
        最近更新 更多