L'attributo refid del set di file/patternset non è espanso.Come scriveresti un target che opera su un insieme arbitrario di file?

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

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?

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top