لم يتم توسيع سمة Refid الخاصة بـ Fileset/PatternSet. كيف يمكنك كتابة هدف يعمل على مجموعة من الملفات التعسفية؟

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

سؤال

لدي مجموعة من الأهداف التي يفعل كل منها نفس الشيء باستثناء كل منها يحتوي على محدد patternset التي تؤدي مهامها. أرغب في انهيار هذه الأهداف إلى هدف واحد "قابل لإعادة الاستخدام" والذي يأخذ بدلاً من ذلك مجموعة من الملفات "كمعلمة".

على سبيل المثال ، هذا

<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 لم يتم توسيعها كما تم الرد عليها في نانت ديف البريد الإلكتروني نشر لأن الأنماط والملفات تختلف عن الخصائص. في هذا الكود غير العمل ، متى echo يسمى ، لها patternset يشير العنصر $ {sourceFiles} بدلا من المسمى واحد اختبار.

كيف يمكن للمرء أن يكتب هدفًا قابلًا للاستخدام يعمل على مجموعة متفاوتة من الملفات؟ هل هناك طريقة للقيام بذلك في Nant كما هو دون اللجوء إلى كتابة المهام المخصصة؟

هل كانت مفيدة؟

المحلول

لقد توصلت أخيرًا إلى هذا ، والذي يخدم أغراضي. كمكافأة ، يوضح هذا أيضًا استدعاء الهدف ديناميكيًا.

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

نصائح أخرى

لست متأكدًا من أنني فهمت تمامًا ما تحاول تحقيقه ، لكن لا ينبغي أن تنسب dynamic من مهمة property هل الوظيفة؟

<target name="filesettest">
  <property name="sourcefiles" value="test" dynamic="true" />
  <!-- ... -->
</target>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top