لم يتم توسيع سمة Refid الخاصة بـ Fileset/PatternSet. كيف يمكنك كتابة هدف يعمل على مجموعة من الملفات التعسفية؟
-
27-09-2019 - |
سؤال
لدي مجموعة من الأهداف التي يفعل كل منها نفس الشيء باستثناء كل منها يحتوي على محدد 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>