2009-03-26 12 views
3

J'essaye de faire fonctionner ant4eclipse et j'ai utilisé ant un peu, mais pas beaucoup au-dessus d'un simple langage de script. Nous avons plusieurs dossiers sources dans nos projets Eclipse donc l'exemple dans la documentation ant4eclipse doit être adaptée à:Comment "développer" un chemin ant (accédé avec refId = ..) à tous les fichiers du chemin sauf certains?

Actuellement, je donne les résultats suivants:

<target name="build"> 

    <!-- resolve the eclipse output location --> 
    <getOutputpath property="classes.dir" workspace="${workspace}" projectName="${project.name}" /> 

    <!-- init output location --> 
    <delete dir="${classes.dir}" /> 
    <mkdir dir="${classes.dir}" /> 

    <!-- resolve the eclipse source location --> 
    <getSourcepath pathId="source.path" project="." allowMultipleFolders='true'/> 

    <!-- read the eclipse classpath --> 
    <getEclipseClasspath pathId="build.classpath" 
          workspace="${workspace}" projectName="${project.name}" /> 

    <!-- compile --> 
    <javac destdir="${classes.dir}" classpathref="build.classpath" verbose="false" encoding="iso-8859-1"> 
    <src refid="source.path" /> 
    </javac> 

    <!-- copy resources from src to bin --> 
    <copy todir="${classes.dir}" preservelastmodified="true"> 
    <fileset refid="source.path"> 
     <include name="**/*"/> 
     <!-- 
     patternset refid="not.java.files"/> 
     --> 
    </fileset> 
    </copy> 
</target> 

La tâche est exécutée avec succès, mais je ne peux pas obtenir le pour travailler - il est supposé copier aussi tous les fichiers non-java pour émuler le comportement d'eclipse. Donc, j'ai un pathId nommé source.path qui contient plusieurs répertoires, que j'ai besoin de masser d'une manière ou d'une autre pour faire quelque chose comme la tâche de copie. J'ai essayé d'imbriquer ce qui n'est pas valide, et d'autres suppositions sauvages.

Comment puis-je faire cela - merci d'avance.

Répondre

2

Vous pouvez utiliser la tâche foreach de la bibliothèque ant-contrib:

<target name="build"> 
    ... 

    <!-- copy resources from src to bin --> 
    <foreach target="copy.resources" param="resource.dir"> 
     <path refid="source.path"/> 
    </foreach> 
</target> 

<target name="copy.resources"> 
    <copy todir="${classes.dir}" preservelastmodified="true"> 
     <fileset dir="${resource.dir}" exclude="**/*.java"> 
    </copy> 
</target> 

Si votre source.path contient des chemins de fichiers et alors vous pourriez le pour empêcher d'essayer de copier des fichiers tâche if (aussi de fourmi-contrib) pour un chemin de fichier, par exemple

<target name="copy.resources"> 
    <if> 
     <available file="${classes.dir}" type="dir"/> 
     <then> 
      <copy todir="${classes.dir}" preservelastmodified="true"> 
       <fileset dir="${resource.dir}" exclude="**/*.java"> 
      </copy> 
     </then> 
    </if> 
</target> 
+0

C'est ce que j'ai fini par faire. Notez que pour tout système de construction émulant raisonnablement complet Eclipse, cela devient hors de contrôle. –

3

Vous pouvez envisager d'utiliser pathconvert pour construire un modèle qui peut fonctionner avec fileset includes.

<pathconvert pathsep="/**/*," refid="source.path" property="my_fileset_pattern"> 
    <filtermapper> 
     <replacestring from="${basedir}/" to="" /> 
    </filtermapper> 
</pathconvert> 

Cela va peupler ${my_fileset_pattern} avec une chaîne comme:

1/**/*,2/**/*,3 

si source.path se composait des trois répertoires 1, 2 et 3 sous le basedir. Nous utilisons le pathsep pour insérer des caractères génériques qui s'étendront à l'ensemble complet de fichiers plus tard.

La propriété peut maintenant être utilisée pour générer un ensemble de fichiers de tous les fichiers. Notez qu'un complément supplémentaire /**/* est nécessaire pour développer le dernier répertoire de l'ensemble. L'exclusion peut être appliquée à ce stade.

<fileset dir="." id="my_fileset" includes="${my_fileset_pattern}/**/*"> 
    <exclude name="**/*.java" /> 
</fileset> 

La copie de tous les fichiers non-java devient alors:

<copy todir="${classes.dir}" preservelastmodified="true"> 
    <fileset refid="my_fileset" /> 
</copy> 

qui copie les fichiers source sur conservant la structure du répertoire source sous todir. Si nécessaire, l'attribut flatten de la tâche de copie peut être défini pour faire en sorte que tous les fichiers source soient directement copiés vers todir. Notez que l'exemple pathconvert ici est pour un système de fichiers unix, plutôt que Windows. Si quelque chose de portable est nécessaire, alors la propriété file.separator doit être utilisée pour construire le motif:

<property name="wildcard" value="${file.separator}**${file.separator}*" /> 
<pathconvert pathsep="${wildcard}," refid="source.path" property="my_fileset"> 
... 
Questions connexes