2010-10-01 3 views
3

У меня есть набор целей, каждый из которых делает по существу одно и то же, кроме каждого, содержит конкретный patternset, на котором выполняются его задачи. Я хочу свернуть эти цели в одну «повторно используемую» цель, которая вместо этого принимает набор файлов «как параметр».Атрибут refet файла набора/шаблона не расширен. Как бы вы написали цель, которая работает с произвольным набором файлов?

Например, это

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

будет заменен

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

Однако, оказывается, что refid не расширяется, как ответил на nant-dev email posting потому patternsets и наборы файлов отличаются от свойств. В этом нерабочем коде, когда вызывается echo, его элемент patternset ссылается на шаблонный набор буквально с именем $ {sourcefiles} вместо имени test.

Как написать повторно используемый NAnt-объект, который работает с различным набором файлов? Есть ли способ сделать это в NAnt as-is, не прибегая к написанию пользовательских задач?

+0

Вторая ссылка не указывает на отправку электронной почты nant-dev, а на документацию NAnt шаблонов. –

+0

Спасибо, фиксированная ссылка. – Kit

ответ

6

Я, наконец, придумал это, что служит моим целям. В качестве бонуса это также демонстрирует динамическое назначение цели.

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

Большое спасибо - умный обходной путь! Ты спас мне много времени. Я несколько раз перепутал с refid и наборами файлов, пока не нашел это. Мне действительно нужно плевать на Нанта, это потрясающая демонстрация того, как чрезмерно усложнять ситуацию, когда простые функции, такие как динамические исправления на наборе файлов или поддержка нескольких файлов в foreach, не учитываются. –

0

Я не уверен, что полностью понял, чего вы пытаетесь достичь, но не должен приписывать dynamic из task property выполнять эту работу?

<target name="filesettest"> 
    <property name="sourcefiles" value="test" dynamic="true" /> 
    <!-- ... --> 
</target> 
+0

Это была моя вторая попытка, но это контролирует, когда свойство получает свою ценность. В коде NAnt ссылочные типы, используемые для задач, не подлежат расширению свойств, поэтому им не повезло. – Kit