O atributo refid do FileSet/PatternSet não é expandido. Como você escreveria um alvo que opera em um conjunto arbitrário de arquivos?
-
27-09-2019 - |
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?
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>