developer tip

Ant에서 파일이 아닌 디렉토리의 존재를 확인할 수있는 방법이 있습니까?

copycodes 2020. 11. 17. 08:22
반응형

Ant에서 파일이 아닌 디렉토리의 존재를 확인할 수있는 방법이 있습니까?


Ant를 사용하여 폴더가 있는지 어떻게 확인합니까?

파일의 존재를 확인할 수 있지만 폴더에 대해서도 똑같이 할 수 있습니까?


유형이 "dir"로 설정된 사용 가능한 작업을 사용합니다 .

예를 들면 :

<available file="${dir}" type="dir"/>

조건부 처리를 수행하는 표준 방법은 조건 태스크를 사용하는 입니다. 아래 예제에서 doFoo를 실행하면 디렉토리가 있으면 메시지가 표시되고 doBar를 실행 하면 디렉토리가 없으면 메시지 가 표시됩니다.

dir.check의 대상이 doFoo과도 바르 모두 필요하며, 그것은 설정 dir.exists의 참 또는 거짓 가능한 작업의 결과에 따라에 속성을. doFoo 타겟은 해당 속성이 true로 설정된 경우에만 실행되고 doBar는 설정되지 않거나 false로 설정된 경우에만 실행됩니다.

<?xml version="1.0"?>
<project name="test" default="doFoo" basedir=".">
  <property name="directory" value="c:\test\directory"/>

  <target name="doFoo" depends="dir.check" if="dir.exists">
    <echo>${directory} exists</echo>
  </target>

  <target name="doBar" depends="dir.check" unless="dir.exists">
    <echo>${directory} missing"</echo>
  </target>

  <target name="dir.check">
    <condition property="dir.exists">
      <available file="${directory}" type="dir"/>
    </condition>
  </target>
</project>

Antelope 는 처리를 더 간단하게 할 수있는 If 작업을 포함하여 추가 작업을 제공합니다 (그리고 저에게는 더 직관적) . 다운로드 페이지 에서 Antelope 작업을 다운로드 할 수 있습니다 .


다음은 available요소를 if테스트에 통합하는 작은 예 입니다.

<!-- Test if a directory called "my_directory" is present -->
<if>
  <available file="my_directory" type="dir" />
  <then>
    <echo message="Directory exists" />
  </then>
  <else>
    <echo message="Directory does not exist" />
  </else>
</if>

경고 : ANT_HOME \ lib 디렉토리에 ant-contrib.jar이 필요합니다. 그렇지 않으면 if요소에 액세스 할 수 없으며 스크립트가 다음 오류와 함께 실패합니다.

Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

다음은 속성을 설정하고 'if'또는 'unless'와 함께 대상을 사용할 필요가없는 솔루션입니다.

매크로 :

<macrodef name="assertDirAvailable">
    <attribute name="dir" />
    <sequential>
        <fail message="The directory '@{dir}' was expected to be available but is not">
            <condition>
                <not>
                    <available file="@{dir}" type="dir" />
                </not>
            </condition>
        </fail>
    </sequential>
</macrodef>

용법:

<assertDirAvailable dir="${dirToCheck}" />

ANT 1.8 버전을 사용하는 내 솔루션은 $ {evalTrueOrFalse} 구문을 지원하거나 지원하지 않는 한 이전 버전이 작동하지 않을 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project name="DoMagic" default="build" basedir=".">

<property environment="env" />
<property name="name" value="Do the ANT Magic" />
<property name="somedir" value="./must_exist_folder"/>
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp>

<target name="doMagic" if="${dir.exists}">
  <echo message="Do the magic stuff" />
</target>

<target name="doUsage" unless="${dir.exists}">
  <echo message="Do usage and help" />
</target>

<target name="build">
  <echo message="Do the magic" />

  <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition>
  <echo message="Folder found: ${dir.exists}" />
  <antcall target="doCustomize"></antcall>
  <antcall target="doUsage"></antcall>
</target>

</project>
  • ANT 1.6 또는 초기 ANT 1.7이 작동하지 않습니다. ANT 1.8 릴리스로 업그레이드하십시오.
  • 대상 속성 경우하지 않는 한 참 /의 false로 평가 $ {VAR} 구문을
  • 변수가 설정되지 않은 상태에서 사용 가능한 조건이 거짓이면 조건 속성 else 값이 속성으로 설정됩니다. NotSet 값은 명시 적 거짓 값과 동일하지 않습니다.
  • 대상을 호출하지만 속성이 실제로 실행되는지 여부를 정의하는 경우

http://ant.apache.org/manual/properties.html#if+unless
[If/Unless] In Ant 1.7.1 and earlier, these attributes could only be property names. As of Ant 1.8.0, you may instead use property expansion. Compared to the older style, this gives you additional flexibility.


Here is another approach, allows to call just one task without using ant-contrib.jar.

<target name="my-task" depends="dir-check">
    <antcall target="my-task-install"/>
    <antcall target="my-task-update"/>
</target>
<target name="my-task-install" unless="dir.exists" >
    {some task}
</target>
<target name="my-task-update" if="dir.exists" >
    {another task}
</target>
<target name="dir-check">
    <condition property="dir.exists">
        <available file="my-dir" type="dir" />
    </condition>
</target>

참고URL : https://stackoverflow.com/questions/1163998/do-i-have-a-way-to-check-the-existence-of-a-directory-in-ant-not-a-file

반응형