2014-01-20 4 views
-1

이렇게 사용 가능한 태그에 변수를 설정할 수 있습니까?개미에서 사용 가능한 작업

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

사용 가능한 태그에서 변수 대신 속성을 사용하면 값이 변경되지 않기 때문입니다. 하지만 런타임에 그것을 변경하고 싶습니다. 아래 코드는 내 구성 요소 목록을 통해 1 파일 검사를 복사하고 싶습니다. 파일이 존재한다면 복사하고 옮겨야합니다. 그렇지 않으면 나는 논리를 건너 뛰어야한다. 나는이 코드를 사용 해달라고하면 파일이 존재하는 경우 schema.params.file, scripts.dir가 true로 설정되어있는 경우 그러나 일이 뭐죠 그것은 다음 반복에 overided되지 않고, 첫 번째 반복에서

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

에도 비록 파일 doenot가 존재한다면. 그래서 위의 코드를 추가했습니다.하지만 항상 위의 코드에 의해 값은 false로 다시 설정됩니다. 어떻게이 2 schema.params.file, 모든 반복에서 scripts.dir을 무시하는 문제를 극복 할 수 있습니까?

<for list="${[email protected]{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> 

답변

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

생각. 그러나 나는 을 많이 사용할 때 <for/> 루프를 통과 할 때가 종종 <macrodef>이라는 것을 발견했다. Ant의 최신 버전에서는 localize 속성을 사용할 수 있으므로 더 이상 <var/> 작업이 더 이상 필요하지 않을 것으로 생각됩니다. 일을 좀 더 쉽게 만들 수 있습니다

또 다른 것은 당신이 당신의 코드를 조금 청소기를 만들 수 있습니다 이렇게 이해하기 쉽게 <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> 

<if/> 테스트를 사용할 수 있다는 것입니다. 또한 처음부터 속성을 설정 해제 할 필요가 없습니다.

-1

개미는 덮어 쓰기 속성을 허용하지 않습니다. 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="${[email protected]{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> 
관련 문제