2012-10-26 95 views
0

我嘗試解析ini文件到了我可以在我的Ant腳本使用的屬性。我有以下幾點:ANT:設置屬性不起作用?

<project name="DeployScript" default="deploy-staging" basedir="."> 
    <taskdef resource="net/sf/antcontrib/antcontrib.properties" /> 

    <!-- The location of the settings.ini file --> 
    <property name="ini-file" location="../settings.ini" /> 

    <loadfile property="iniConfig" srcFile="${ini-file}"/> 

    <target name="deploy-staging" 
     description="Deploy project to staging environment" > 
     <echo message="Ini file: ${ini-file}" /> 
     <echo message="${lib}" /> 
     <echo message="${store_dir}" /> 
     <echo message="${ant.home}" /> 

     <!--- walk the ini file's lines --> 
     <foreach list="${iniConfig}" 
      target="echoMsg" 
      param="line" 
      delimiter="${line.separator}" /> 

     <echo message="HERE: ${prevSection}" /> 
    </target> 

    <property name="prevSection" value="" /> 

    <!-- this is executed for every line in the ini file. --> 
    <target name="echoMsg"> 
     <!-- strip out the section name, variable name and value (if exists on the line) --> 
     <propertyregex property="secm" 
      input="${line}" 
      regexp="^\[(.*)\]" 
      select="\1" 
      casesensitive="false" /> 
     <propertyregex property="name" 
      input="${line}" 
      regexp="^([\S]+)\s*=\s*([^;]+)" 
      select="\1" 
      casesensitive="false" 
      defaultValue="" /> 
     <propertyregex property="value" 
      input="${line}" 
      regexp="^([\S]+)\s*=\s*([^;]+)" 
      select="\2" 
      casesensitive="false" 
      defaultValue="" /> 

     <!-- overwrite the previous section if we have found a new one. --> 
     <if> 
      <isset property="secm" /> 
      <then> 
       <echo message="PREVSECTION IS SET" /> 
       <property name="prevSection" value="${secm}" /> 
      </then> 
     </if> 

     <!-- display the information about the found data -->  
     <echo message="line = ${line}" /> 
     <echo message="section = ${secm}" /> 
     <echo message="name = ${name}" />   
     <echo message="value = ${value}" /> 
     <echo message="new last section: ${prevSection}" /> 
     <echo message="----" />    
    </target> 
</project> 

我嘗試做的是分析所有的name = value對並​​把它們的屬性,如:section.name =值;

不知何故,部分不是「echoMsg」目標範圍內記住。我想要記住部分的名字。

所以,

[global] 
name=var 
name2=val 

[section2] 
name=var 

應該改爲:

global.name=var 
global.name2=val 
section2.name=var 

這是我的ant腳本的輸出:

echoMsg: 
[echo] PREVSECTION IS SET 
[echo] line = [global] 
[echo] section = global 
[echo] name = 
[echo] value = 
[echo] new last section: global 
[echo] ---- 

echoMsg: 
[echo] line = servername = my-server.local ; Server name 
[echo] section = ${secm} 
[echo] name = servername 
[echo] value = mac-mini-van-Peter.local7 
[echo] new last section: ${prevSection} 
[echo] ---- 

正如你所看到的,最後一個「$ {prevSection }「未設置。我希望它是「全球」。

我試圖用的,而不是財產,但沒有差別。

+0

嘗試使用[''](http://ant.apache.org/manual/Tasks/echoproperties.html)任務,你在讀INI後文件。這將列出所有屬性,並且您可以看到實際上在Ant中設置了哪些屬性。這可能會幫助您查看錯誤的位置。我從來沒有使用Ant中INI文件,所以我不知道它是如何在。 –

回答

1

這裏有一個提示:嘗試添加回聲部分<propertyregex>語句之前,看看有什麼不同屬性的值。

我添加了這些<echo>線...

<target name="echoMsg"> 
    <!-- strip out the section name, variable name and value (if exists on the line) --> 
    <echo message="prev line = ${line}" /> 
    <echo message="prev section = ${secm}" /> 
    <echo message="prev name = ${name}" /> 
    <echo message="prev value = ${value}" /> 
    <echo message="prev new last section: ${prevSection}" /> 
    <echo message="----" /> 

現在讓我們來看看輸出:

deploy-staging: 
    [echo] Ini file: /Users/david/property.ini 
    [echo] ${lib} 
    [echo] ${store_dir} 
    [echo] /usr/share/ant 

echoMsg: 
    [echo] prev line = [global] 
    [echo] prev section = ${secm} 
    [echo] prev name = ${name} 
    [echo] prev value = ${value} 
    [echo] prev new last section: 
    [echo] ---- 
    [echo] PREVSECTION IS SET 
    [echo] line = [global] 
    [echo] section = global 
    [echo] name = 
    [echo] value = 
    [echo] new last section: 
    [echo] ---- 

echoMsg: 
    [echo] prev line = name=foo 
    [echo] prev section = ${secm} 
    [echo] prev name = ${name} 
    [echo] prev value = ${value} 
    [echo] prev new last section: 
    [echo] ---- 
    [echo] line = name=foo 
    [echo] section = ${secm} 
    [echo] name = name 
    [echo] value = foo 
    [echo] new last section: 
    [echo] ---- 

echoMsg: 
    [echo] prev line = name2=bar 
    [echo] prev section = ${secm} 
    [echo] prev name = ${name} 
    [echo] prev value = ${value} 
    [echo] prev new last section: 
    [echo] ---- 
    [echo] line = name2=bar 
    [echo] section = ${secm} 
    [echo] name = name2 
    [echo] value = bar 
    [echo] new last section: 
    [echo] ---- 

echoMsg: 
    [echo] prev line = [section2] 
    [echo] prev section = ${secm} 
    [echo] prev name = ${name} 
    [echo] prev value = ${value} 
    [echo] prev new last section: 
    [echo] ---- 
    [echo] PREVSECTION IS SET 
    [echo] line = [section2] 
    [echo] section = section2 
    [echo] name = 
    [echo] value = 
    [echo] new last section: 
    [echo] ---- 

echoMsg: 
    [echo] prev line = name=fubar 
    [echo] prev section = ${secm} 
    [echo] prev name = ${name} 
    [echo] prev value = ${value} 
    [echo] prev new last section: 
    [echo] ---- 
    [echo] line = name=fubar 
    [echo] section = ${secm} 
    [echo] name = name 
    [echo] value = fubar 
    [echo] new last section: 
    [echo] ---- 
    [echo] HERE: 

BUILD SUCCESSFUL 
Total time: 1 second 

<echomsg>每次調用失去以前在<echomsg>設置的值。

我建議你試試<for>任務。通過循環的每次迭代,<for>任務不會丟失屬性的值。但是,必須將override設置添加到<propertyregex>任務中,並使用<var>任務而不是<property>任務才能夠通過循環的每次迭代來重置屬性值。

您還可以改變你的<taskdef>這樣:

<taskdef resource="net/sf/antcontrib/antlib.xml" /> 
+0

感謝大衛讀取。它完美的工作! – user1351312

1

這是爲我工作的代碼。只是想與WWW分享:

<project name="DeployScript" default="deploy-staging" basedir="."> 
    <taskdef resource="net/sf/antcontrib/antlib.xml" /> 

    <!-- The location of the settings.ini file --> 
    <property name="ini-file" location="../settings.ini" /> 

    <!-- load the ini file --> 
    <loadfile property="iniConfig" srcFile="${ini-file}"/> 

    <!-- when no section is given, the vars are stored in the "default" section --> 
    <var name="theSection" value="default" /> 

    <!-- set global properties for this build --> 
    <target name="deploy-staging" description="" > 

     <echo message="Start parsing ini file" level="info" /> 

     <!-- 
      PARSE INI FILE 
      This section parses the ini file and creates the parameters 
      which we can use in this script. 
     --> 
     <for list="${iniConfig}" param="line" delimiter="${line.separator}" trim="true"> 
      <sequential> 

       <propertyregex property="newSection" input="@{line}" regexp="^\[(.*)\]" select="\1" casesensitive="false" defaultvalue="" override="true" /> 
       <propertyregex property="name" input="@{line}" regexp="^([^;][\S]+)\s*=\s*([^;]+)" select="\1" casesensitive="false" defaultValue="" override="true" /> 
       <propertyregex property="value" input="@{line}" regexp="^([^;][\S]+)\s*=\s*([^;]+)" select="\2" casesensitive="false" defaultValue="" override="true" /> 

       <if> 
        <!-- if we recieved a new section --> 
        <isset property="newSection" /> 
        <then> 
         <if> 
          <!-- section is not empty --> 
          <not><equals arg1="${newSection}" arg2="" /></not> 
          <then> 
           <!-- store this as the new section --> 
           <var name="theSection" value="${newSection}" /> 
          </then> 
         </if>      
        </then> 
       </if> 

       <!-- only create a new var if we have a var-name --> 
       <if> 
        <isset property="name" /> 
        <then> 
         <if> 
          <!-- name is not empty --> 
          <not><equals arg1="${name}" arg2="" /></not> 
          <then> 
           <!-- store this as the new section --> 
           <var name="${theSection}.${name}" value="${value}" /> 
           <echo message="${theSection}.${name} = ${value}" level="info" /> 
          </then> 
         </if>      
        </then> 
       </if> 
      </sequential> 
     </for> 
    </target> 

</project> 
相關問題