1

私は ant が初めてで、むしろ Makefile に慣れています。プロジェクトでは、Message_zh.class などの i18n 言語モジュールは、コンパイルのたびに zh.po などから無条件にビルドされますが、それらは既に存在するため、多くの時間を浪費します。これらはbuild.xmlの関連部分であると考えました:

<target id="msgfmt" name="msgfmt">
    <mkdir dir="po/classes" />
    <propertyregex property="filename"
              input="${file}"
              regexp="[.]*/po/([^\.]*)\.po"
              select="\1"
              casesensitive="false" />
    <exec dir="." executable="msgfmt">
        <arg line="--java2 -d po/classes -r app.i18n.Messages -l ${filename} po/${filename}.po"/>
    </exec>
</target>

<target id="build-languageclasses" name="build-languageclasses" >
    <echo message="Compiling po files." />
    <foreach target="msgfmt" param="file">
      <path>
        <fileset dir="po" casesensitive="yes">
          <include name="**/*.po"/>
        </fileset>
      </path>
    </foreach>
</target>

ターゲット build-languageclasses はコンパイル ターゲットに依存しているため、コンパイルのたびに、束全体が再度 msgfmted されます。1. po ファイルが変更された場合、または 2. クラスファイルが存在しない場合にのみ msgfmt を呼び出すには、これをどのように記述すればよいでしょうか? これが追加のソフトウェアなしで可能になるとうれしいです。例を教えてください。

最初の解決策では、アリの行動に違いはありません。

<target id="build-languageclasses" description="compile if Messages??.class files not uptodate" name="build-languageclasses" unless="i18n.uptodate">
  <condition property="i18n.uptodate">
    <uptodate>
      <srcfiles dir="${po}" includes="**/*.po"/>
      <mapper type="glob" from="${po}/*.po" to="${po}/classes/app/i18n/Messages*.class"/>
    </uptodate>
  </condition>
  <echo message="Compiling po files." />
  <foreach target="msgfmt" param="file">
    <path>
      <fileset dir="po" casesensitive="yes">
        <include name="**/*.po"/>
      </fileset>
    </path>
  </foreach>
</target> 

ここで何が問題なのですか?

4

2 に答える 2

1

問題は、タスクi18n.uptodateを実行する前にプロパティをテストしていることです。uptodate条件ブロックは、build-languageclassesターゲットに入る前に実行する必要があります。

次のようにコードを再編成する必要があります。

  • unless="i18n.uptodate"メイン ターゲットの を削除します
  • build-languageclassesを 2 つのターゲットに分割します。
  • 1 つ目は条件の初期化専用で、<condition>ブロックのみが含まれます。
  • ファイルを生成するコードを含む 2 番目のファイル ( <foreach>)

i18n.uptodate2 番目のターゲットは、最初のターゲットによって設定されたプロパティに応じて条件付きで実行されるように構成されます。

編集- uptodate タスクの実例を次に示します。

<property name="source" value="${basedir}/src"/>
<property name="dist" value="${basedir}/dist"/>

<target name="init">
    <condition property="that.uptodate">
        <uptodate>
            <srcfiles dir="${source}" includes="*.txt"/>
            <mapper type="glob" from="*.txt" to="${dist}/*.bat"/>
        </uptodate>
    </condition>
</target>

<target description="check that" name="dist" unless="that.uptodate" depends="init">
    <echo>we have something to do!</echo>
</target>

やあ M.

于 2012-07-23T16:27:50.410 に答える
0

最初のメールの2番目のソースのような構造が必要な場合はant-contrib--OutOfDate--を使用してみて くださいhttp://ant-contrib.sourceforge.net/tasks/tasks/outofdate.html

于 2012-12-31T14:17:48.930 に答える