2010-11-17 14 views
30

Tôi có một file kiến ​​nào sau đây:Tôi làm cách nào để cho phép tệp thuộc tính Ant ghi đè lên giá trị được đặt trong một tệp khác?

<property file="project.properties" description="Project configuration properties"/> 
<property file="build-defaults.properties" description="default build configuration."/> 
<property file="build.properties" description="local build configuration overrides"/> 

Tôi muốn có giá trị mặc định đặt trong build-defaults.properties (được kiểm tra vào SCM) nhưng cho phép các nhà phát triển để ghi đè lên giá trị trong một xây dựng địa phương. các thuộc tính để chúng có thể làm việc với các đường dẫn cục bộ.

Vấn đề là, nó dường như không hoạt động; Tôi đã thiết lập điều này, tạo ra một ghi đè trong build.properties, nhưng giá trị của đường dẫn của tôi vẫn là giá trị được đặt trong build-defaults.properties. Làm cách nào để tôi thực hiện việc này?

Trả lời

46

Vấn đề ban đầu với thiết lập của bạn là bạn đã hoàn lại build.propertiesbuild-defaults.properties.

Ant Properties được đặt một lần và sau đó không bao giờ có thể bị ghi đè. Đó là lý do tại sao đặt bất kỳ thuộc tính nào trên dòng lệnh thông qua một số -Dproperty=value sẽ luôn ghi đè mọi thứ bạn đã đặt trong tệp; tài sản được thiết lập và sau đó không có gì có thể ghi đè lên nó.

Vì vậy, theo cách mà bạn muốn điều này thiết lập là:

<property file="build.properties" description="local build configuration overrides"/> 
<property file="project.properties" description="Project configuration properties"/> 
<property file="build-defaults.properties" description="default build configuration."/> 

Bằng cách này:

  1. Bất cứ điều gì đặt ở dòng lệnh được ưu tiên hơn build.properties
  2. Bất cứ điều gì đặt trong xây dựng. các thuộc tính ghi đè các giá trị khác
  3. vv trên đường xuống.
17

Thực tế, đặc tính kiến ​​có thể bị ghi đè. Xem tài liệu của property task:

Không thể thay đổi giá trị thuộc tính thông thường, khi thuộc tính được đặt, hầu hết các tác vụ sẽ không cho phép sửa đổi giá trị của thuộc tính.

Một trong các tác vụ có thể ghi đè giá trị thuộc tính là script. Ngoài ra bất kỳ nhiệm vụ tùy chỉnh có thể sử dụng backdoor này. Các đề xuất khác đang được đề cập đến Ant loadfile override property. Điều này là chống lại tinh thần của kiến ​​và thường là không cần thiết. Nhưng nó là tốt để biết rằng, bởi vì tôi chỉ có một vấn đề đối diện: tại sao giá trị tài sản thay đổi mặc dù nó là bất biến.

Đây là mục tiêu mẫu sử dụng tác vụ tập lệnh để thay đổi giá trị của thuộc tính. Nó cho thấy các phương thức cơ bản để làm việc với các thuộc tính. Tất cả các phương pháp được mô tả trong Ant Api mà không có sẵn trực tuyến. Bạn cần tải xuống số Ant Manual. Trong thư mục api có tài liệu api.

<target name="t1"> 
    <property name="a" value="one" /> 
    <script language="javascript"> 
     sProp = project.getProperty("a"); 
     sProp = sProp.replace("e", "ly"); 
     project.setProperty("a", sProp); 
     project.setNewProperty("a", "new value"); 
    </script> 
    <property name="a" value="two" /> 
    <echo>a=${a}</echo> 
    </target> 

Cách dễ dàng thiết lập tác vụ script? Thực hiện tác vụ tập lệnh chạy với ngôn ngữ beanshell hơi phức tạp và không tầm thường, nhưng được giải thích trong this answer. Tuy nhiên, như được ghi chú là Rebse, sử dụng ngôn ngữ javascript được hỗ trợ trong hộp trong jdk 6.

+2

Thiết lập tác vụ tập lệnh không phức tạp khi sử dụng jdk> = 1.6, có nghĩa là không cần thêm jars (Bean Scripting Framework và công cụ ..) nữa khi tàu jdk có động cơ javascript (dựa trên Rhino 1.6R2). Chỉ cần sử dụng tác vụ kịch bản với javascript .. Hoặc sử dụng Groovy chỉ cần một cái bình – Rebse

+1

@Rebse, bạn đã thực hiện một ngày với đề xuất 'javascript'. Nó hoạt động như một say mê! Tôi đã chỉnh sửa câu trả lời của tôi để bao gồm nó. Đối với các ngôn ngữ khác, ngay cả khi chúng chỉ cần một bình, liên kết vẫn hữu ích. – Jarekczek

+0

cảnh báo quảng cáo không biết xấu hổ ;-) Ant addon Flaka (http://code.google.com/p/flaka/) làm cho nhiều phần kịch bản bị ám ảnh (ghi đè tài sản, vòng lặp ..), cũng chỉ cần một bình. Bên cạnh Flaka tôi sử dụng Groovy rất nhiều - không chỉ cho kịch bản kiến. – Rebse

3

tài sản Ant không thể được ghi đè trừ khi sử dụng vĩ mô và javascript plug-in để làm:

Bước 1: định nghĩa một hàm macro để ghi đè lên bất động sản

<!--overwrite property's value--> 
    <macrodef name="set" > 
     <attribute name="name"/> 
     <attribute name="value"/> 
     <sequential> 
      <script language="javascript"> 
       <![CDATA[ 
       project.setProperty("@{name}", "@{value}"); 
       ]]> 
      </script> 
     </sequential> 
    </macrodef> 

Bước 2: sử dụng macro trong the ant xml

<set 
    name="your_target_property" 
    value="your_value" or "${another_property}"  
</set> 
Các vấn đề liên quan