2

Ant を使用した自動ビルド プロセスに取り組んでいます。

1 つの目標は、変数が既に設定されているかどうかを確認し、設定されていない場合は空の文字列に設定し、環境キーとして実行可能ファイルにエクスポートすることです。blaプロパティが定義されているかどうかにかかわらず、複数のプロパティ ファイルがあります。したがって、ファイルのリストを繰り返し処理し、次のことを行います。

<for list="${propertyfiles}" param="mypropertyfile">
    <var name="bla" unset="true" />
    <property file="@{mypropertyfile}.properties" />
    <property name="bla" value=""/>
    ... use the "bla" property for something ... 
</for>

行を説明するには:

<var name="bla" unset="true" /> 

前のループパスから使用された値がないことを確認することです。プロパティが定義されているか定義されていないプロパティ ファイルを含めblaます。

<property file="@{mypropertyfile}.properties" />

プロパティを使用できることを確認しblaます。プロパティの不変性を使用するのが賢明だと思いました。そう

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

プロパティファイルで定義されていない場合に備えて、プロパティを設定します。すでに定義されている場合、理論上、プロパティの初期値を上書きすることはできません。

ここで奇妙なことに、私の UNIX システムでは、このアプローチは魔法のように機能しますが、Windowsではそうではありません。定義されたプロパティ値は空の文字列で上書きされます。どちらのマシンにも ant 1.8 がインストールされています。

<if>プロパティフラグを使用して別の方法で問題を解決できることは知ってい<isset>ますが、これがどのように可能か疑問に思っています。この一貫性のない動作を理解するのを手伝っていただければ幸いです。

4

1 に答える 1

0

1.0b2 と 1.0b3 の両方でテストした ant-contrib のバージョンについて言及していないことを考えると、変数と unset はVariable Taskの一部です。これは単一のデータポイントにすぎませんが、結果の真実を想定することから始めることができると思います。つまりunset="true"、ant 1.8 の Windows と *nix の両方で、以前に設定されている場合は、それ以外の場合は不変のプロパティの値を再割り当てできます ( for ループの内外を問わず)、それ以外の場合は効果がありません。

そのため、未設定の呼び出しとプロパティをデフォルト値に設定する間に問題が発生します。これは、Windows でプロパティが期待どおりに設定されていないことです。したがって、考えられる原因を 2 つ見ていきます。

  1. プロパティ ファイルがLoad Specificationに準拠していません。たとえば、このプログラムのようなバージョンの unix2dos を実行して、誤った CRLF/LF の混乱を取り除くことができます。ISO 8859-1 文字エンコーディングを使用していることを確認してください ( Textなどを使用できます)。このためのファイル エンコーディング ディテクター) を使用して、異常な文字をエスケープし\"ます。
  2. プロパティ ファイルでは、プロパティの最後の定義が優先されるため、たとえば、Linux 固有のファイル内プロパティ展開を""Windows プロパティの後にデフォルト設定することができます。

ただし<echo> ${bla}、プロパティが実際にファイルから正しく読み込まれていることが示されている場合は、コードを for ループから移動することから始め、単一のケースで機能するかどうかを確認します。私のテストコード:

<project name="propertyMutator" default="mutator">
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<echo>Running ${ant.version}</echo>
<target name="mutator">
    <for list="one,two,three" param="mypropertyfile">
        <sequential>
          <var name="bla" unset="true" />
          <property file="@{mypropertyfile}.properties" />
          <echo message="Bla before default is: ${bla}"/>
          <property name="bla" value="default value"/>
          <echo message="Bla after default is: ${bla}"/>
        </sequential>
    </for>
</target>  
</project>

one.properties: bla=${some.var}
two.properties: nothing=toSee
three.properties: bla=hello1
                  bla=hello2
                  bla=hello3

版画

Buildfile: C:\workspace\proj\propertyMutator.xml
 [echo] Running Apache Ant(TM) version 1.8.3 compiled on February 26 2012
mutator:
 [echo] Bla before default is: ${some.var}
 [echo] Bla after default is: ${some.var}
 [echo] Bla before default is: ${bla}
 [echo] Bla after default is: default value
 [echo] Bla before default is: hello3
 [echo] Bla after default is: hello3

Linux と Windows の両方で。

于 2012-08-13T11:03:23.153 に答える