มีงาน ANT ที่จะดำเนินการบล็อกเฉพาะถ้าไฟล์ที่กำหนดมีอยู่? ฉันมีปัญหาที่ฉันมีสคริปต์ ant ทั่วไปที่ควรทำการประมวลผลพิเศษบางอย่าง แต่เฉพาะถ้าแฟ้มการกำหนดค่าเฉพาะมีอยู่
มีงาน ANT ที่จะดำเนินการบล็อกเฉพาะถ้าไฟล์ที่กำหนดมีอยู่? ฉันมีปัญหาที่ฉันมีสคริปต์ ant ทั่วไปที่ควรทำการประมวลผลพิเศษบางอย่าง แต่เฉพาะถ้าแฟ้มการกำหนดค่าเฉพาะมีอยู่
คำตอบ:
<target name="check-abc">
<available file="abc.txt" property="abc.present"/>
</target>
<target name="do-if-abc" depends="check-abc" if="abc.present">
...
</target>
if
และunless
เปิดใช้งานหรือปิดการใช้งานเป้าหมายที่พวกเขาจะแนบเท่านั้นนั่นคือการอ้างอิงของเป้าหมายจะดำเนินการเสมอ มิฉะนั้นจะไม่สามารถทำงานได้ขึ้นอยู่กับเป้าหมายที่ตั้งค่าคุณสมบัติที่คุณกำลังตรวจสอบ
<Available>
เลิกใช้แล้ว ฉันเคยใช้สิ่งนี้: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target>
ตรวจสอบ: nant.sourceforge.net/release/0.85/help/functions/…
<available>
เลิกใช้ที่ไหน 2: ${file::existst...}
ดูเหมือนจะไม่ทำงานกับ Ant (Apache ANT 1.9.7)
สิ่งนี้อาจช่วยให้เข้าใจได้ง่ายขึ้นจากมุมมองการเข้ารหัส (สามารถใช้ได้กับ ant-contrib: http://ant-contrib.sourceforge.net/ ):
<target name="someTarget">
<if>
<available file="abc.txt"/>
<then>
...
</then>
<else>
...
</else>
</if>
</target>
ตั้งแต่ Ant 1.8.0 มีผู้ใช้ทรัพยากรอยู่ด้วย
จาก http://ant.apache.org/manual/Tasks/conditions.html
ทดสอบทรัพยากรเพื่อการมีอยู่ ตั้งแต่ Ant 1.8.0
ระบุทรัพยากรจริงเพื่อทดสอบเป็นองค์ประกอบที่ซ้อนกัน
ตัวอย่าง:
<resourceexists> <file file="${file}"/> </resourceexists>
ฉันทำงานเกี่ยวกับการทำตัวอย่างจากคำตอบที่ดีสำหรับคำถามนี้จากนั้นฉันก็พบสิ่งนี้
ตั้งแต่ Ant 1.8.0 คุณสามารถใช้การขยายคุณสมบัติแทนได้ ค่าของจริง (หรือเปิดหรือใช่) จะเปิดใช้งานรายการในขณะที่เท็จ (หรือปิดหรือไม่) จะปิดใช้งานรายการ ค่าอื่นยังคงถือว่าเป็นชื่อคุณสมบัติและเพื่อให้รายการถูกเปิดใช้งานเฉพาะเมื่อมีการกำหนดคุณสมบัติที่มีชื่อ
เมื่อเปรียบเทียบกับสไตล์ที่เก่ากว่าสิ่งนี้จะให้ความยืดหยุ่นเพิ่มเติมแก่คุณเนื่องจากคุณสามารถแทนที่เงื่อนไขจากบรรทัดคำสั่งหรือสคริปต์หลัก:
<target name="-check-use-file" unless="file.exists"> <available property="file.exists" file="some-file"/> </target> <target name="use-file" depends="-check-use-file" if="${file.exists}"> <!-- do something requiring that file... --> </target> <target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>
จากคู่มือมดที่http://ant.apache.org/manual/properties.html#if+unless
หวังว่าตัวอย่างนี้ใช้กับบางคน พวกเขาไม่ได้ใช้นักวิเคราะห์ทรัพยากร แต่สมมุติว่าคุณทำได้ใช่ไหม .....
if="${file.exists}"
ควรแทนที่ด้วยif="file.exists"
เป็นif
และunless
ตรวจสอบการมีอยู่ของคุณสมบัติตามชื่อเท่านั้นไม่ใช่มูลค่า
ฉันคิดว่ามันมีค่าอ้างอิงคำตอบที่คล้ายกันนี้: https://stackoverflow.com/a/5288804/64313
นี่เป็นอีกวิธีแก้ปัญหาอย่างรวดเร็ว มีรูปแบบอื่น ๆ ที่เป็นไปได้นี้โดยใช้<available>
แท็ก:
# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
<condition><not>
<available file="${file}" />
</not></condition>
</fail>
DB_*/**/*.sql
นี่คือรูปแบบที่หลากหลายในการดำเนินการหากมีไฟล์หนึ่งไฟล์ขึ้นไปที่สอดคล้องกับตัวกรองตัวแทน นั่นคือคุณไม่ทราบชื่อที่แน่นอนของไฟล์
ที่นี่เรากำลังมองหาไฟล์" * .sql " ในไดเรกทอรีย่อยใด ๆ ที่เรียกว่า " DB_ * " ซ้ำ ๆ คุณสามารถปรับตัวกรองตามความต้องการของคุณ
NB: Apache Ant 1.7 ขึ้นไป!
นี่คือเป้าหมายในการตั้งค่าคุณสมบัติหากมีไฟล์ที่ตรงกัน:
<target name="check_for_sql_files">
<condition property="sql_to_deploy">
<resourcecount when="greater" count="0">
<fileset dir="." includes="DB_*/**/*.sql"/>
</resourcecount>
</condition>
</target>
นี่คือเป้าหมาย "ตามเงื่อนไข" ที่จะทำงานหากไฟล์มีอยู่เท่านั้น:
<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
<!-- Do stuff here -->
</target>
คุณสามารถทำได้โดยสั่งให้ดำเนินการกับรายการของไฟล์ที่มีชื่อเท่ากับชื่อที่คุณต้องการ มันง่ายกว่าและตรงกว่าการสร้างเป้าหมายพิเศษ และคุณไม่ต้องการเครื่องมือเพิ่มเติมใด ๆ เพียงแค่ Ant ล้วนๆ
<delete>
<fileset includes="name or names of file or files you need to delete"/>
</delete>