O atributo refid do FileSet/PatternSet não é expandido. Como você escreveria um alvo que opera em um conjunto arbitrário de arquivos?

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

Pergunta

Eu tenho um conjunto de metas que cada um faz essencialmente a mesma coisa, exceto que cada um contém um específico PatternSet para executar suas tarefas. Quero entrar em colapso desses metas em um único alvo "reutilizável" que, em vez disso, leva um conjunto de arquivos "como um parâmetro".

Por exemplo, 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>

seria substituído 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>

No entanto, acontece que refid não é expandido conforme respondido em um Postagem de e-mail de Nant-Dev porque os padrões e os arquivos diferem das propriedades. Neste código não trabalhador, quando echo é chamado, seu patternset Referências de elemento Um conjunto de padrões literalmente nomeado $ {fontesfiles} em vez do nomeado teste.

Como se escreveria um destino NANT reutilizável que opera em um conjunto variável de arquivos? Existe uma maneira de fazer isso em Nant como está sem recorrer à escrita de tarefas personalizadas?

Foi útil?

Solução

Finalmente criei isso, o que serve aos meus propósitos. Como bônus, isso também demonstra chamar um alvo dinamicamente.

<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>

Outras dicas

Não tenho certeza se entendi completamente o que você está tentando alcançar, mas não devo atribuir dynamic do tarefa property faça o trabalho?

<target name="filesettest">
  <property name="sourcefiles" value="test" dynamic="true" />
  <!-- ... -->
</target>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top