ภารกิจ Ant เพื่อรันเป้าหมาย Ant ต่อเมื่อมีไฟล์อยู่หรือไม่?


153

มีงาน ANT ที่จะดำเนินการบล็อกเฉพาะถ้าไฟล์ที่กำหนดมีอยู่? ฉันมีปัญหาที่ฉันมีสคริปต์ ant ทั่วไปที่ควรทำการประมวลผลพิเศษบางอย่าง แต่เฉพาะถ้าแฟ้มการกำหนดค่าเฉพาะมีอยู่


คำตอบ:


200

ที่มีอยู่และเงื่อนไข

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 

8
ที่มีอยู่เป็นชื่อที่ไม่ชัดเจนสำหรับสิ่งที่มันทำ ฉันสับสนมากขึ้นจากความจริงที่ว่า google แสดงให้ผู้คนเขียนแท็กของตัวเอง
Mario Ortegón

มันอาจใช้งานได้ แต่ดูเหมือนจะไม่เป็นทางออกที่ดีถ้าคุณต้องการนำไปใช้กับไฟล์จำนวนมาก
cmcginty

4
ในกรณีที่ทุกคนสงสัยว่าคุณลักษณะifและunlessเปิดใช้งานหรือปิดการใช้งานเป้าหมายที่พวกเขาจะแนบเท่านั้นนั่นคือการอ้างอิงของเป้าหมายจะดำเนินการเสมอ มิฉะนั้นจะไม่สามารถทำงานได้ขึ้นอยู่กับเป้าหมายที่ตั้งค่าคุณสมบัติที่คุณกำลังตรวจสอบ
sschuberth

ดูเหมือนว่า<Available>เลิกใช้แล้ว ฉันเคยใช้สิ่งนี้: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> ตรวจสอบ: nant.sourceforge.net/release/0.85/help/functions/…
Loïc

1
@ Loïc 1:มันระบุว่า<available>เลิกใช้ที่ไหน 2: ${file::existst...}ดูเหมือนจะไม่ทำงานกับ Ant (Apache ANT 1.9.7)
user85421

123

สิ่งนี้อาจช่วยให้เข้าใจได้ง่ายขึ้นจากมุมมองการเข้ารหัส (สามารถใช้ได้กับ ant-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

36
ฉันคิดว่ามันมีเฉพาะใน ant-contrib
Richard Cook

26

ตั้งแต่ 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

หวังว่าตัวอย่างนี้ใช้กับบางคน พวกเขาไม่ได้ใช้นักวิเคราะห์ทรัพยากร แต่สมมุติว่าคุณทำได้ใช่ไหม .....


2
โปรดทราบว่าif="${file.exists}"ควรแทนที่ด้วยif="file.exists"เป็นifและunlessตรวจสอบการมีอยู่ของคุณสมบัติตามชื่อเท่านั้นไม่ใช่มูลค่า
Vadzim

1
@Vadzim ตามคำตอบที่กล่าวมาสิ่งนี้ใช้ได้เฉพาะใน Ant 1.8 และ 1.8 เท่านั้นที่รองรับการขยายคุณสมบัติ ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky

12

ฉันคิดว่ามันมีค่าอ้างอิงคำตอบที่คล้ายกันนี้: 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>

3

ทำเครื่องหมายที่การใช้ตัวกรองชื่อไฟล์เช่น 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>

0

คุณสามารถทำได้โดยสั่งให้ดำเนินการกับรายการของไฟล์ที่มีชื่อเท่ากับชื่อที่คุณต้องการ มันง่ายกว่าและตรงกว่าการสร้างเป้าหมายพิเศษ และคุณไม่ต้องการเครื่องมือเพิ่มเติมใด ๆ เพียงแค่ Ant ล้วนๆ

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

ดู: fileset

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.