L'attributo refid del set di file/patternset non è espanso.Come scriveresti un target che opera su un insieme arbitrario di file?
-
27-09-2019 - |
Domanda
Ho una serie di obiettivi che fanno ciascuno essenzialmente la stessa cosa tranne che ciascuno contiene un obiettivo specifico modello su cui svolgere i propri compiti.Voglio comprimere questi target in un unico target "riutilizzabile" che accetta invece un insieme di file "come parametro".
Ad esempio, questo
<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>
verrebbe sostituito da
<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>
Tuttavia, si scopre che refid
non è espanso come risposto in a invio di e-mail a nant-dev perché i set di modelli e i set di file differiscono dalle proprietà.In questo codice non funzionante, quando echo
si chiama, suo patternset
L'elemento fa riferimento a un patternset chiamato letteralmente ${filesorgente} invece di quello nominato test.
Come si scriverebbe un target NAnt riutilizzabile che operi su un insieme variabile di file?C'è un modo per farlo in NAnt così com'è senza ricorrere alla scrittura di attività personalizzate?
Soluzione
Alla fine ho trovato questo, che serve ai miei scopi.Come bonus, questo dimostra anche di chiamare un bersaglio in modo dinamico.
<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>
Altri suggerimenti
Non sono sicuro di aver compreso completamente ciò che stai cercando di ottenere, ma non dovrei attribuirlo dynamic
Di compito property
Fai il lavoro?
<target name="filesettest">
<property name="sourcefiles" value="test" dynamic="true" />
<!-- ... -->
</target>