Có một Nhiệm vụ ANT sẽ chỉ thực hiện một khối nếu một tệp nhất định tồn tại? Tôi có một vấn đề là tôi có một tập lệnh ant chung nên thực hiện một số xử lý đặc biệt nhưng chỉ khi có một tệp cấu hình cụ thể.
Có một Nhiệm vụ ANT sẽ chỉ thực hiện một khối nếu một tệp nhất định tồn tại? Tôi có một vấn đề là tôi có một tập lệnh ant chung nên thực hiện một số xử lý đặc biệt nhưng chỉ khi có một tệp cấu hình cụ thể.
Câu trả lời:
<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
và unless
chỉ 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.
<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
<available>
được phản đối? 2: ${file::existst...}
dường như không hoạt động với Ant (Apache ANT 1.9.7)
Đ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>
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ể? .....
if="${file.exists}"
nên được thay thế bằng if="file.exists"
as if
và unless
chỉ 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ó.
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>
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>
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 .