atributo refid conjunto de archivos / de patternset no se expande. ¿Cómo se escribe un objetivo que opera sobre un conjunto arbitrario de archivos?
-
27-09-2019 - |
Pregunta
Tengo un conjunto de objetivos que cada uno haga esencialmente la misma cosa, excepto cada uno contiene una específica patternset en el que realizar sus tareas. Quiero colapsar estos objetivos en un solo objetivo "reutilizable" que en vez toma un conjunto de archivos "como parámetro".
Por ejemplo, este
<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>
sería reemplazado por
<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>
Sin embargo, resulta que refid
no se expande como respondida en un Nant-dev publicación de correo electrónico porque patternsets y conjuntos de archivos difieren de propiedades. En este código no laborable, cuando echo
se llama, sus referencias a elementos de patternset
un patternset literalmente denominan $ {} sourcefiles en lugar de la llamada test .
¿Cómo se podría escribir un objetivo de NAnt reutilizable que opera sobre un conjunto variación de archivos? ¿Hay una manera de hacer esto en Nant tal y como son, sin recurrir a la escritura de las tareas personalizadas?
Solución
Finalmente ocurrió esto, que sirve a mis propósitos. Como beneficio adicional, esto también demuestra llamar a un objetivo de forma dinámica.
<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>
Otros consejos
No estoy seguro de haber entendido completamente lo que usted está tratando de lograr, pero no debe atributo dynamic
de property
tarea hacer el trabajo?
<target name="filesettest">
<property name="sourcefiles" value="test" dynamic="true" />
<!-- ... -->
</target>