l'attribut refid de l'ensemble de fichiers / patternset n'est pas élargi. Comment voulez-vous écrire une cible qui fonctionne sur un ensemble arbitraire de fichiers?
-
27-09-2019 - |
Question
J'ai un ensemble d'objectifs que chaque font essentiellement la même chose, sauf que chaque contient un patternset sur lequel effectuer ses tâches. Je veux effondrer ces objectifs en une seule cible « réutilisable » qui prend la place d'un ensemble de fichiers « comme paramètre ».
Par exemple, cette
<target name="echo1">
<foreach item="File" property="fn">
<in>
<items>
<include name="*.config"/>
</items>
</in>
<do>
<echo message="${fn}" />
</do>
</foreach>
</target>
<target name="echo2">
<foreach item="File" property="fn">
<in>
<items>
<include name="*.xml"/>
</items>
</in>
<do>
<echo message="${fn}" />
</do>
</foreach>
</target>
<target name="use">
<call target="echo1"/>
<call target="echo2"/>
</target>
sera remplacé par
<patternset id="configs">
<include name="*.config"/>
</patternset>
<patternset id="xmls">
<include name="*.xml"/>
</patternset>
<target name="echo">
<foreach item="File" property="fn">
<in>
<items>
<patternset refid="${sourcefiles}"/>
</items>
</in>
<do>
<echo message="${fn}" />
</do>
</foreach>
</target>
<target name="use">
<property name="sourcefiles" value="configs"/>
<call target="echo"/>
<property name="sourcefiles" value="xmls"/>
<call target="echo"/>
</target>
Cependant, il se avère que refid
n'est pas développé comme une réponse dans un Nant-dev email affichage parce patternsets et diffèrent des propriétés filesets. Dans ce code non-travail, quand echo
est appelé, ses références d'éléments de patternset
un patternset littéralement nommé $ {SourceFiles} au lieu de celui nommé test .
Comment peut-on écrire une cible de NAnt réutilisable qui fonctionne sur un ensemble de fichiers variation de? Est-il possible de le faire dans NAnt en l'état sans avoir recours à l'écriture des tâches personnalisées?
La solution
Je suis finalement arrivé avec ce qui sert mes objectifs. En prime, cela démontre également appeler une cible dynamique.
<project
name="dynamic-fileset"
default="use"
xmlns="http://nant.sourceforge.net/release/0.86-beta1/nant.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<target name="configs">
<fileset id="files">
<include name="*.config"/>
</fileset>
</target>
<target name="xmls">
<fileset id="files">
<include name="*.xml"/>
</fileset>
</target>
<target name="echo">
<foreach item="File" property="fn">
<in>
<items refid="files"/>
</in>
<do>
<echo message="${fn}" />
</do>
</foreach>
</target>
<target name="use">
<property name="grouplist" value="xmls,configs"/>
<foreach item="String" in="${grouplist}" delim="," property="filegroup">
<do>
<call target="${filegroup}"/>
<call target="echo"/>
</do>
</foreach>
</target>
</project>
Autres conseils
Je ne suis pas sûr complètement compris ce que vous essayez d'atteindre, mais ne devrait pas dynamic
d'attribut property
tâche faire le travail?
<target name="filesettest">
<property name="sourcefiles" value="test" dynamic="true" />
<!-- ... -->
</target>