2009-11-19 17 views
7

Trong xml phing sau, bên trong mục tiêu "skel" tôi kiểm tra xem ứng dụng có được định cấu hình hay không, sau đó tôi gọi cấu hình đích và sau đó áp dụng cấu hình một số tệp.Mục tiêu được gọi qua số <phingcall> không đặt thuộc tính khi gọi mục tiêu

Vấn đề là thuộc tính db.host không được đặt sau phingcall, mặc dù nó được đặt sau thuộc tính.

Tôi đang thiếu gì?

<!-- base configuration --> 
<property name="paths.config" value="config" /> 
<property name="paths.config.file" value="${paths.config}/environment.ini" /> 

<available file="${paths.config.file}" property="configured" /> 

<target name="configure"> 
    <if> 
    <equals arg1="${configured}" arg2="true" /> 
    <then> 
     <echo message="Reconfigure ..." /> 
    </then> 
    <else> 
     <echo message="Configure ..." /> 
    </else> 
    </if> 

    <propertyprompt propertyName="db.host" defaultValue="localhost" promptText="Mysql Server Host" /> 
</target> 

<target name="skel"> 
    <echo msg="Skel files..." /> 

    <if> 
    <equals arg1="${configured}" arg2="${configured}" /> 
    <then> 
     <echo message="Missing config file ..." /> 
     <phingcall target="configure" /> 
    </then> 
    </if> 

    <echo message="${db.host}" /> 
    <copy todir="config"> 
     <mapper type="glob" from="*.skel" to="*"/> 
     <filterchain> 
      <expandproperties /> 
     </filterchain> 

     <fileset dir="config"> 
      <include name="*.skel" /> 
     </fileset> 
    </copy> 
</target> 

Trả lời

6

Tôi nghĩ rằng phingcall sẽ tạo ra một môi trường mới trong nội bộ. Khi mục tiêu cấu hình được thực hiện, môi trường này nằm ngoài phạm vi.

Điều này có nghĩa là bạn không thể sử dụng mục tiêu cấu hình riêng như bạn đang đề xuất.

Giải pháp duy nhất có thể là tạo mục tiêu cấu hình tạo tệp cấu hình được sử dụng bởi các mục tiêu khác.

2

Thuộc tính được đặt bên trong các mục tiêu được đặt cho các mục tiêu đó và không thể truy cập được bên ngoài mục tiêu chính của chúng.

Từ the documentation for PropertyTask:

Lưu ý quan trọng về phạm vi: khi thẻ <property> được gọi là bên trong một thẻ <phingcall>, bất kỳ thuộc tính được thiết lập trong một phạm vi địa phương mới. Do đó, bất kỳ thuộc tính hoặc biến nào khác được đặt bên trong phạm vi đó sẽ ngừng tồn tại (hoặc hoàn nguyên về giá trị trước đó của chúng) khi thẻ hoàn thành cha mẹ <phingcall> hoàn tất.

Các vấn đề liên quan