Tarefa Ant para executar um destino Ant apenas se existir um arquivo?

153

Existe uma tarefa ANT que execute um bloco apenas se um determinado arquivo existir? Eu tenho o problema de ter um script ant genérico que deve executar algum processamento especial, mas apenas se um arquivo de configuração específico estiver presente.

Mario Ortegón
fonte

Respostas:

200

Disponível e Condição

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

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
kit de ferramentas
fonte
8
Disponível é um nome não tão óbvio para o que faz. Eu tenho ainda mais confuso com o fato de que o Google mostra as pessoas escrevendo suas próprias tags
Mario Ortegón
ele pode trabalhar, mas não parece ser uma boa solução se você precisa aplicar a um grande número de arquivos
cmcginty
4
Caso alguém se pergunte, os atributos ife unlesssomente habilitam ou desabilitam o destino ao qual estão conectados, ou seja, as dependências do destino sempre são executadas. Caso contrário, não funcionaria para depender de um destino que define a propriedade que você está verificando.
sschuberth
Parece que <Available>está obsoleto. Eu usei isso: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> check: nant.sourceforge.net/release/0.85/help/functions/…
Loïc
1
@ Loïc 1: onde afirma que <available>está obsoleto? 2: ${file::existst...} parece não estar funcionando com o Ant (Apache ANT 1.9.7)
user85421 7/17/17
123

Isso pode fazer um pouco mais de sentido da perspectiva da codificação (disponível com ant-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
Adão
fonte
36
Isso está disponível apenas no ant-contrib, eu acho.
Richard Cook
26

Desde o Ant 1.8.0, aparentemente também existem recursos

Em http://ant.apache.org/manual/Tasks/conditions.html

Testa um recurso quanto à existência. desde Ant 1.8.0

O recurso real a ser testado é especificado como um elemento aninhado.

Um exemplo:

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

Eu estava refazendo o exemplo da boa resposta acima para esta pergunta e, então, achei isso

A partir do Ant 1.8.0, você pode usar a expansão de propriedade; um valor true (ou ativado ou yes) ativará o item, enquanto false (ou desativado ou não) o desativará. Ainda se supõe que outros valores sejam nomes de propriedades e, portanto, o item será ativado apenas se a propriedade nomeada estiver definida.

Comparado ao estilo mais antigo, isso oferece flexibilidade adicional, porque você pode substituir a condição na linha de comando ou nos scripts pai:

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

do manual ant em http://ant.apache.org/manual/properties.html#if+unless

Espero que este exemplo seja útil para alguns. Eles não estão usando recursos, mas provavelmente você poderia? .....

Jon Stafford
fonte
2
Observe que if="${file.exists}"deve ser substituído por if="file.exists"as ife unlessverifique apenas a existência da propriedade pelo nome, não pelo valor.
Vadzim
1
@Vadzim Como a resposta mencionada, isso funciona apenas no Ant 1.8, e o 1.8 suporta expansão de propriedades. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky
12

Eu acho que vale a pena referenciar esta resposta semelhante: https://stackoverflow.com/a/5288804/64313

Aqui está outra solução rápida. Existem outras variações possíveis usando a <available>tag:

# 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>
cmcginty
fonte
3

Marque Usando filtros de nome de arquivo, como DB_*/**/*.sql

Aqui está uma variação para executar uma ação se existir um ou mais arquivos correspondentes a um filtro curinga. Ou seja, você não sabe o nome exato do arquivo.

Aqui, estamos procurando arquivos " * .sql " em qualquer subdiretório chamado " DB_ * ", recursivamente. Você pode ajustar o filtro às suas necessidades.

Nota: Apache Ant 1.7 e superior!

Aqui está o destino para definir uma propriedade se existirem arquivos correspondentes:

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

Aqui está um destino "condicional" que é executado apenas se existirem arquivos:

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

Você pode fazer isso solicitando a operação com uma lista de arquivos com nomes iguais ao (s) nome (s) necessário (s). É muito mais fácil e direto do que criar um alvo especial. E você não precisa de ferramentas adicionais, apenas o Ant puro.

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

Veja: FileSet .

Gangnus
fonte