파일이 존재하는 경우에만 Ant 대상을 실행하는 Ant 태스크?


답변:


200

사용 가능조건

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 

8
사용 가능하다는 것은 명백하지 않은 이름입니다. 나는 더 구글 쇼의 사람들이 자신의 태그를 작성하는 사실에 의해 혼동있어
마리오 Ortegón

많은 파일에 적용해야하는 경우에는 효과가있을 수 있지만 좋은 해결책은 아닙니다.
cmcginty

4
궁금한 사람이있는 경우 ifunless속성은 첨부 된 대상 만 활성화 또는 비활성화합니다. 즉, 대상의 종속성이 항상 실행됩니다. 그렇지 않으면 확인하려는 속성을 설정하는 대상에 의존하지 않습니다.
sschuberth

<Available>더 이상 사용되지 않는 것 같습니다 . 나는 이것을 사용했다 : <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> 확인 : nant.sourceforge.net/release/0.85/help/functions/…
Loïc

1
@ Loïc 1 :<available> 더 이상 사용되지 않는 곳 은 어디 입니까? 2 : ${file::existst...} Ant와 작동하지 않는 것 같습니다 (Apache ANT 1.9.7)
user85421

123

이것은 코딩 관점에서 조금 더 의미가있을 수 있습니다 (ant-contrib : http://ant-contrib.sourceforge.net/ ) :

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

36
이것은 내가 생각하는 개미 contrib에서만 사용할 수 있습니다.
Richard Cook

26

Ant 1.8.0 이후로 분명히 리소스도 존재합니다.

에서 http://ant.apache.org/manual/Tasks/conditions.html

자원이 존재하는지 테스트합니다. Ant 1.8.0 이후

테스트 할 실제 자원은 중첩 요소로 지정됩니다.

예를 들면 :

<resourceexists>
  <file file="${file}"/>
</resourceexists>

나는이 질문에 대한 위의 좋은 대답에서 예를 재 작업 한 것이었고 이것을 찾았습니다.

Ant 1.8.0부터는 속성 확장을 대신 사용할 수 있습니다. 값이 true (또는 on 또는 yes)이면 항목이 활성화되고 false (또는 off 또는 no)이면 항목이 비활성화됩니다. 다른 값은 여전히 ​​속성 이름으로 간주되므로 명명 된 속성이 정의 된 경우에만 항목이 활성화됩니다.

이전 스타일과 비교하면 명령 줄 또는 부모 스크립트에서 조건을 무시할 수 있기 때문에 유연성이 추가됩니다.

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

개미 매뉴얼 http://ant.apache.org/manual/properties.html#if+unless에서

이 예제가 일부 사람들에게 유용하기를 바랍니다. 그들은 자원을 사용하지 않지만 아마도 당신은 할 수 있습니까? .....


2
참고 if="${file.exists}"로 교체해야합니다 if="file.exists"으로 if하고 unless, 이름없는 그것의 가치를 재산의 존재를 확인한다.
Vadzim

1
@Vadzim 대답에서 언급했듯이 이것은 Ant 1.8에서만 작동하며 1.8은 속성 확장을 지원합니다. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky

12

나는이 비슷한 대답을 참조 할 가치가 있다고 생각합니다 : https://stackoverflow.com/a/5288804/64313

또 다른 빠른 해결책이 있습니다. <available>태그를 사용하여 다른 변형이 가능합니다 .

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>

3

다음과 같은 파일 이름 필터 사용 확인 DB_*/**/*.sql

다음은 하나 이상의 파일이 와일드 카드 필터에 해당하는 경우 작업을 수행하는 변형입니다. 즉, 파일의 정확한 이름을 모릅니다.

여기서는 " DB_ * " 라는 서브 디렉토리에서 " * .sql "파일을 재귀 적으로 찾고 있습니다. 필요에 따라 필터를 조정할 수 있습니다.

NB : Apache Ant 1.7 이상!

일치하는 파일이있는 경우 속성을 설정하는 대상은 다음과 같습니다.

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

파일이 존재하는 경우에만 실행되는 "조건부"대상은 다음과 같습니다.

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>

0

필요한 이름과 이름이 같은 파일 목록을 사용하여 작업을 수행하도록 명령하여 수행 할 수 있습니다. 특별한 대상을 만드는 것보다 훨씬 쉽고 직접적입니다. 추가 도구가 필요 없으며 순수한 Ant 만 있습니다.

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

FileSet을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.