Tác vụ Ant chỉ chạy mục tiêu Ant nếu tệp tồn tại?


Câu trả lời:


200

Có sẵnđiều kiện

<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
Có sẵn là một tên không quá rõ ràng cho những gì nó làm. Tôi càng thêm bối rối bởi thực tế là google cho thấy mọi người viết các thẻ của riêng họ
Mario Ortegón

nó có thể hoạt động, nhưng có vẻ không phải là một giải pháp tốt nếu bạn cần áp dụng cho một số lượng lớn tệp
cmcginty

4
Trong trường hợp bất kỳ ai thắc mắc, các thuộc tính ifunlesschỉ kích hoạt hoặc vô hiệu hóa mục tiêu mà chúng được gắn vào, tức là các phụ thuộc của mục tiêu luôn được thực thi. Nếu không, nó sẽ không hoạt động để phụ thuộc vào mục tiêu đặt thuộc tính bạn đang kiểm tra.
sschuberth

Có vẻ như <Available>bị phản đối. Tôi đã sử dụng cái này: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> check: nant.sourceforge.net/release/0,85/help/fifts/iêu
Loïc

1
@ Loïc 1: nơi mà nó <available>được phản đối? 2: ${file::existst...} dường như không hoạt động với Ant (Apache ANT 1.9.7)
user85421

123

Điều này có thể có ý nghĩa hơn một chút từ góc độ mã hóa (có sẵn với ant-contrib: http://ant-contrib.sourceforge.net/ ):

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

36
Điều này chỉ có sẵn trong ant-contrib tôi nghĩ.
Richard Cook

26

Vì Ant 1.8.0 rõ ràng cũng có tài nguyên

Từ http://ant.apache.org/manual/T task / conditions.html

Kiểm tra một nguồn lực cho sự tồn tại. kể từ khi kiến ​​1.8.0

Tài nguyên thực tế để kiểm tra được chỉ định là một phần tử lồng nhau.

Một ví dụ:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

Tôi đã làm lại ví dụ từ câu trả lời tốt ở trên cho câu hỏi này, và sau đó tôi thấy điều này

Kể từ Ant 1.8.0, thay vào đó bạn có thể sử dụng mở rộng thuộc tính; một giá trị true (hoặc bật hoặc có) sẽ cho phép mục đó, trong khi false (hoặc tắt hoặc không) sẽ vô hiệu hóa nó. Các giá trị khác vẫn được coi là tên thuộc tính và vì vậy mục chỉ được bật nếu thuộc tính được đặt tên được xác định.

So với kiểu cũ, điều này mang lại cho bạn sự linh hoạt bổ sung, bởi vì bạn có thể ghi đè điều kiện từ dòng lệnh hoặc tập lệnh cha:

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

từ hướng dẫn sử dụng kiến ​​tại http://ant.apache.org/manual/properIES.html#if+unless

Hy vọng ví dụ này được sử dụng cho một số. Họ không sử dụng tài nguyên, nhưng có lẽ bạn có thể? .....


2
Lưu ý rằng if="${file.exists}"nên được thay thế bằng if="file.exists"as ifunlesschỉ kiểm tra sự tồn tại của tài sản theo tên, không phải giá trị của nó.
Vadzim

1
@Vadzim Như câu trả lời đã đề cập, điều này chỉ hoạt động trong Ant 1.8 và 1.8 không hỗ trợ mở rộng thuộc tính. ant.apache.org/manual/properIES.html#if+unless
Daniel Yankowsky

12

Tôi nghĩ rằng giá trị của nó tham khảo câu trả lời tương tự này: https://stackoverflow.com/a/5288804/64313

Đây là một giải pháp nhanh chóng khác. Có các biến thể khác có thể về điều này bằng cách sử dụng <available>thẻ:

# 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

Kiểm tra bằng cách sử dụng các bộ lọc Tên tệp như DB_*/**/*.sql

Dưới đây là một biến thể để thực hiện một hành động nếu một hoặc nhiều tệp tồn tại tương ứng với bộ lọc ký tự đại diện. Đó là, bạn không biết tên chính xác của tập tin.

Ở đây, chúng tôi đang tìm kiếm các tệp " * .sql " trong bất kỳ thư mục con nào được gọi là " DB_ * ", theo cách đệ quy. Bạn có thể điều chỉnh bộ lọc theo nhu cầu của bạn.

Lưu ý: Apache Ant 1.7 trở lên!

Đây là mục tiêu để đặt thuộc tính nếu tồn tại các tệp phù hợp:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

Đây là mục tiêu "có điều kiện" chỉ chạy nếu tồn tại tệp:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>

0

Bạn có thể làm điều đó bằng cách ra lệnh thực hiện thao tác với một danh sách các tệp có tên bằng với tên bạn cần. Nó dễ dàng và trực tiếp hơn nhiều so với việc tạo ra một mục tiêu đặc biệt. Và bạn không cần bất kỳ công cụ bổ sung nào, chỉ cần Ant thuần túy.

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

Xem: Tập tin .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.