Até o tópico
anterior todos os arquivos de build que escrevemos eram
executados pelo Ant de uma só vez, ou seja, não
havia a possibilidade de fazer escolhas ou definir valores após
o início do processo. Neste tópico veremos como
isso é possível.
Uma das aplicações mais interessantes da comunicação
com o Ant após o início da execução
do arquivo de build é solicitar nomes de diretórios
ou arquivos ou ainda solicitar confirmação para
uma tarefa a ser executada.
A tarefa input é usada quando queremos
pausar a execução do Ant e esperar pelo pressionamento
de alguma tecla ou informação do usuário.
Veja um exemplo: <input/>
O simples fato de inserir esta tarefa no fluxo de execução
de um determinado alvo fará com que a execução
do build seja interrompida e recomece somente quando você
pressionar a tecla Enter. É claro que é sempre
uma boa idéia informar o usuário sobre este procedimento.
Assim, uma abordagem melhor é usar: <input>Tecle
Enter para continuar...</input>
Caso você desejar a confirmação do usuário
antes de proceder com a execução do arquivo de
build poderá usar o seguinte código (como um exemplo
vale mais que 1000 palavras, o build a seguir pede confirmação
antes de criar um diretório e copiar um arquivo):
<project name="teste"
basedir="." default="alvo">
<target name="alvo">
<input
message="O
diretorio paginas sera criado agora. Deseja
continuar
(s/n)?"
validargs="s,n"
addproperty="valor"
/>
<condition
property="sair">
<equals
arg1="n" arg2="${valor}"/>
</condition>
<fail if="sair">O
processo de build foi cancelado.</fail>
<mkdir dir="paginas"
/>
<copy file="index.jsp"
todir="paginas" />
</target>
</project>
Ao executarmos este build teremos o seguinte resultado:
C:\testes>ant
Buildfile: build.xml
alvo:
[input] O diretorio paginas sera criado
agora. Deseja continuar (s/n)?(s,n)
s
[mkdir] Created dir: C:\testes\paginas
[copy] Copying 1 file to C:\testes\paginas
BUILD SUCCESSFUL
Total time: 10 seconds
Veja que aqui a resposta para a pergunta foi "s".
Se respondermos "n" teremos outro resultado. Observe:
C:\testes>ant
Buildfile: build.xml
alvo:
[input] O diretorio paginas sera criado
agora. Deseja continuar (s/n)?(s,n)
n
BUILD FAILED
C:\testes\build.xml:11: O processo de build foi cancelado.
Total time: 2 seconds
O primeiro passo para entender este arquivo de build é
começar analisando a tarefa input:
<input
message="O diretorio paginas sera
criado agora. Deseja
continuar (s/n)?"
validargs="s,n"
addproperty="valor" />
Veja que aqui temos três atributos. Veja suas definições
a seguir:
a) message – É a mensagem a ser
exibida para o usuário;
b) validargs – Uma string contendo as
palavras (ou letras) válidas como argumento de entrada
no console. Observe que validarags é
sensitiva à maiúsculas e minúsculas. Em
nosso exemplo aceitamos somente "s" e "n".
Se quiséssemos aceitar também "S" e
"N" bastaria acrescentar estas letras ao valor do
atributo.
c) addproperty – Permite criar uma variável
global que armazenará o valor informado pelo usuário.
Este atributo é muito importante, como veremos mais adiante.
Logo após o elemento input temos uma
condição: <condition
property="sair">
<equals arg1="n" arg2="${valor}"/>
</condition>
Esta condição define uma propriedade (ou seria
melhor chamá-la de variável?) global chamada sair.
Inicialmente o valor para esta propriedade é false.
Dentro do elemento condition temos um elemento
equals que compara o valor informado pelo usuário
(presente em arg2) com um dos valores válidos
como entrada. No nosso exemplo, a propriedade sair
terá o valor true se o valor informado pelo usuário
for igual a "n".
E agora o trecho mais importante: um elemento fail:
<fail if="sair">O
processo de build foi cancelado.</fail>
Este elemento possui apenas um atributo (a mensagem a ser exibida)
e é usado para testarmos valores de propriedades para
decidir se a execução do build deverá prosseguir
ou ser interrompida. Veja como testamos o valor da propriedade
sair definida anteriormente no elemento condition.
É importante observar que, se o teste efetuado no elemento
fail resultar verdadeiro, a execução
do arquivo é interrompida, ou seja, nenhuma linha de
código após este elemento será executada. |