2012-02-01 11 views
5

Problema:Chiamare un compito per ogni file in un set di file con ant semplice con il nome del file come parametro (nessuna attività contrib, non proprie attività)

Se si dispone di file che seguono una certa convenzione di denominazione (ad esempio, comprendono locale) e devono essere elaborati in base al file da uno script ant, quali sono le possibilità nella formica?

Esempio:

file da elaborare:

  • file_en-US.txt
  • file_en-GB.txt
  • ...

Un compito dovrebbe essere ha chiamato tutti i file con il loro nome file come parametro. Le impostazioni locali contenute nel nome file devono essere estratte da un'espressione regolare e passate a uno strumento esterno come parametro. L'estrazione sarà diretta non appena avrai il nome del file.

Restrizioni:

  • Plain Ant (1,7), estensioni permesso alcuna attività custom/contrib come foreach. Ha bisogno di eseguire ogni installazione di vanilla ant (1.7).

risposta

4

ho abbastanza sicuro che non c'è un modo per chiamare genericamente un compito per ogni file senza né creare il proprio custom task o utilizzando ant-contrib. Tuttavia ci sono modi per ottenere form per recuperare automaticamente ant-contrib (o un jar personalizzato) in modo da poter ottenere il risultato desiderato. Questo è l'approccio usato da TIBant, che ha un requisito simile (in modo che sia facile per chiunque di contribuire allo sviluppo),

Passo 1: Scaricare Apache Ivy

Apache Ivy può essere utilizzato per recuperare dipendenze come ant-contrib. Io uso le seguenti proprietà formica e bersaglio per scaricare e caricare Ivy

<property name="ivy.install.version" value="2.2.0" /> 
<property name="ivy.jar.dir" location="${user.home}/.ivy2/jars" /> 
<property name="ivy.jar.file" location="${ivy.jar.dir}/ivy-${ivy.install.version}.jar" /> 

<target name="-download-ivy" unless="ivy.downloaded"> 
    <mkdir dir="${ivy.jar.dir}" /> 
    <!-- download Ivy from web site so that it can be used even without any special installation --> 
    <echo message="installing ivy..." /> 
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" 
     dest="${ivy.jar.file}" 
     usetimestamp="true" 
     verbose="true" /> 
</target> 

<target name="-check-ivy-downloaded"> 
    <condition property="ivy.downloaded"> 
     <and> 
      <available file="${ivy.jar.file}" /> 
      <available file="${ivy.jar.dir}/jsch-0.1.44-1.jar" /> 
     </and> 
    </condition> 
</target> 

<target name="-load-ivy" depends="-check-ivy-downloaded,-download-ivy" unless="ivy.loaded"> 
    <path id="ivy.lib.path"> 
     <fileset dir="${ivy.jar.dir}" includes="*.jar" /> 
    </path> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path" /> 
    <property name="ivy.loaded" value="true" /> 
</target> 

Fase 2: Aggiungi ant-contrib dipendenza

Ivy utilizza un "file di edera" per specificare le dipendenze.È possibile aggiungere ant-contrib come segue

<dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" transitive="false"/> 

un file completo di edera potrebbe assomigliare

<?xml version="1.0" encoding="ISO-8859-1"?> 
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
    <info 
    organisation="org.my" 
    module="mymodule" 
    status="release"/> 

    <dependencies> 
     <dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" transitive="false"/> 
    </dependencies> 
</ivy-module> 

Si potrebbe anche uscita questo file dinamicamente da script di formica utilizzando echoxml

Fase 3: Recupera le dipendenze

Usa Ivy per scaricare ant-contrib (o wha dipendenze Tever hai specificato)

<target name="retrieve" description="retrieve dependancies with ivy" depends="-load-ivy"> 
    <ivy:retrieve /> 
    <ivy:artifactproperty name="[module].[artifact]" value="lib/[artifact]-[revision].[ext]" /> 
</target> 

Fase 4: Carico ant-contrib

<target name="-load-ant-contrib" depends="retrieve" unless="ant.contrib.loaded"> 
    <taskdef resource="net/sf/antcontrib/antlib.xml"> 
     <classpath> 
      <pathelement location="${ant-contrib.ant-contrib}" /> 
     </classpath> 
    </taskdef> 
    <property name="ant.contrib.loaded" value="true" /> 
</target> 

Passo 5: Creare il vostro obiettivo che scorre oltre i file utilizzando for

<target name="mytarget" depends="-load-ant-contrib"> 
    <for param="file"> 
     <fileset dir="somedir" includes="..." /> 
     <sequential> 
      <!-- do stuff with @{file} --> 
     </sequential> 
    </for> 
</target> 

Se hai solo bisogno di scaricare ant-contrib e non voglio t o usa Ivy per gestire altre dipendenze, quindi puoi saltare la maggior parte di quanto sopra e utilizzare semplicemente uno get per scaricare ant-contrib nello stesso modo di cui sopra download Ivy.

+0

Grazie per la tua risposta !!! –

+0

Non risponde alla mia domanda, ma fornisce una buona soluzione/alternativa al mio problema! Grazie per quello –

Problemi correlati