atributo refid conjunto de archivos / de patternset no se expande. ¿Cómo se escribe un objetivo que opera sobre un conjunto arbitrario de archivos?

StackOverflow https://stackoverflow.com/questions/3840846

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?

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top