النمل (1.6.5) - كيفية تعيين اثنين في واحد <condition> أو <if>
-
06-07-2019 - |
سؤال
أنا أحاول أن تعيين اثنين من سلاسل مختلفة إلى اثنين من المتغيرات المختلفة تعتمد على اثنين من القيم المنطقية في النمل.
شبة الكود (العش):
if(condition)
if(property1 == null)
property2 = string1;
property3 = string2;
else
property2 = string2;
property3 = string1;
ما حاولت ؛
<if>
<and>
<not><isset property="property1"/></not>
<istrue value="${condition}" />
</and>
<then>
<property name="property2" value="string1" />
<property name="property3" value="string2" />
</then>
<else>
<property name="property2" value="string2" />
<property name="property3" value="string1" />
</else>
</if>
ولكن يمكنني الحصول على مؤشر فارغة استثناء الخط التي تحتوي على "<if>
".يمكنني الحصول على عمل باستخدام <condition property=...>
الكلمات ولكن يمكن فقط تعيين خاصية واحدة في وقت واحد.حاولت استخدام <propertyset>
لكن ذلك لم يكن يسمح أيضا.
أنا جديدة على النمل كما كنت قد خمنت ربما :).
غاف
المحلول
وهناك عدة طرق للقيام بذلك. الأكثر مباشرة هو لمجرد استخدام بيانين condition
، والاستفادة من ثبات الملكية:
<condition property="property2" value="string1">
<isset property="property1"/>
</condition>
<condition property="property3" value="string2">
<isset property="property1"/>
</condition>
<!-- Properties in ant are immutable, so the following assignments will only
take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>
وهذه هي مرهقة بعض الشيء ولا مقياس جيد، ولكن لخصائص اثنين فقط أنا على الأرجح استخدام هذا النهج.
وهناك طريقة أفضل إلى حد ما هو استخدام مستهدفا مشروطا:
<target name="setProps" if="property1">
<property name="property2" value="string1"/>
<property name="property3" value="string2"/>
</target>
<target name="init" depends="setProps">
<!-- Properties in ant are immutable, so the following assignments will only
take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>
<!-- Other init code -->
</target>
ونحن نتخذ مرة أخرى الاستفادة من ثبات الملكية هنا. إذا كنت لا تريد أن تفعل ذلك، يمكنك استخدام السمة unless
، ومستوى إضافي من indirection:
<target name="-set-props-if-set" if="property1">
<property name="property2" value="string1"/>
<property name="property3" value="string2"/>
</target>
<target name="-set-props-if-not-set" unless="property1">
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>
</target>
<target name="setProps" depends="-set-props-if-set, -set-props-if-not-set"/>
<target name="init" depends="setProps">
<!-- Other init code -->
</target>
ومن المهم أن نلاحظ أن if
وunless
سمات target
فقط معرفة ما اذا كان تم تعيين الخاصية، وليس قيمة العقار.
نصائح أخرى
يمكنك استخدام النمل-Contrib مكتبة الحصول على أنيق <if><then><else>
بناء الجملة ، ومع ذلك فإنه يتطلب بضع تحميل/تثبيت الخطوات.
نرى هذا البعض حتى السؤال: النمل-contrib - إذا/إذن/آخر مهمة