1

macrodef属性がprodに設定されている場合、 logで始まるすべての行を削除しようとしています(以下の例)。replaceregexpを使用して、logで始まるすべての行を削除する予定です。ただし、 ifタスクを使用する以外に、属性が特定の値に設定されているかどうかをテストする方法がわかりません。これを実行するための非コアAntタスクを紹介したくありませんが、他の解決策を思い付くことができません。if-taskを使用する以外に他のオプションはありますか?

ありがとう

<macrodef name="setBuildstamp">
    <attribute name="platform" />
    <sequential>
        <if>
            <equals arg1="platform" arg2="prod" />
            <then>
                <replaceregexp match="^log\(.*" value="" />
            </then> 
        </if>
    </sequential>
</macrodef>
4

3 に答える 3

5

この のように、パラメーターへの参照を使用する必要があります@{platform}

また、replaceregexpタスクにはいくつかのパラメーターがありません。

あなたの特定のケースでは、linecontainsregexpフィルターリーダーを使用する方が良いと思います。これは変更されたコードです ( linecontainsregexp の否定引数に注意してください)。

<macrodef name="setBuildstamp">
  <attribute name="platform" />
  <sequential>
    <if>
      <equals arg1="@{platform}" arg2="prod" />
      <then>
        <copy todir="dest-dir">
          <fileset dir="src-dir"/>
          <filterchain>
            <linecontainsregexp
              regexp="^log\(.*"
              negate="true"
            />
          </filterchain>
        </copy>
      </then> 
    </if>
  </sequential>
</macrodef>
于 2009-10-29T02:18:39.390 に答える
3

これを解決する方法はいくつかあるかもしれませんが、ant-contrib 要素を使用するほど簡単なものはありません。これでアプリケーションに必要なものが得られるかどうかはわかりませんが、次のことを試すことができます。

条件付きターゲットの使用。マクロ定義を呼び出すターゲットに置き換えることができれば、これでうまくいくかもしれません。これによりプロパティがグローバルに設定されるため、アプリケーションでは機能しない可能性があることに注意してください。

<target name="default">
  <condition property="platformIsProd">
    <equals arg1="${platform}" arg2="prod" />
  </condition>
  <antcall target="do-buildstamp" />
</target>
<target name="do-buildstamp" if="platformIsProd">
  <echo>doing prod stuff...</echo>
</target>

「else」ケースを処理します。 別のケースを処理する必要がある場合は、いくつかのターゲットを指定する必要があります...

<target name="default">
  <property name="platform" value="prod" />
  <antcall target="do-buildstamp" />
</target>
<target name="do-buildstamp">
  <condition property="platformIsProd">
    <equals arg1="${platform}" arg2="prod" />
  </condition>
  <antcall target="do-buildstamp-prod" />
  <antcall target="do-buildstamp-other" />
</target>
<target name="do-buildstamp-prod" if="platformIsProd">
  <echo>doing internal prod stuff...</echo>
</target>
<target name="do-buildstamp-other" unless="platformIsProd">
  <echo>doing internal non-prod stuff...</echo>
</target>

外部ビルド ファイルの使用。プロパティに対して異なる値で複数の呼び出しを行う必要がある場合は、同じプロジェクト内の別のビルド ファイルでこれを分離できます。これによりパフォーマンスが少し低下しますが、追加のライブラリは必要ありません。

build.xml で:

<target name="default">
  <ant antfile="buildstamp.xml" target="do-buildstamp" />
  <ant antfile="buildstamp.xml" target="do-buildstamp">
    <property name="platform" value="prod" />
  </ant>
  <ant antfile="buildstamp.xml" target="do-buildstamp">
    <property name="platform" value="nonprod" />
  </ant>
</target>

buildstamp.xml で:

<condition property="platformIsProd">
  <equals arg1="${platform}" arg2="prod" />
</condition>
<target name="do-buildstamp">
  <antcall target="do-buildstamp-prod" />
  <antcall target="do-buildstamp-other" />
</target>
<target name="do-buildstamp-prod" if="platformIsProd">
  <echo>doing external prod stuff...</echo>
</target>
<target name="do-buildstamp-other" unless="platformIsProd">
  <echo>doing external non-prod stuff...</echo>
</target>

プロジェクトに ant-contrib を追加します。もちろん、プロジェクトにファイルを追加できる場合、最も簡単なのは ant-contrib.jar ファイルを追加することです。「tools」フォルダーの下に置き、タスク定義を使用してプルすることができます。

<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/tools/ant-contrib.jar" />
于 2009-10-29T01:43:22.237 に答える
0

実稼働環境専用のプロジェクトを構築しているとき、実稼働環境で実行したくないコードを削除しているように見えます。したがって、開発環境またはテスト環境で実行されるものとは異なるバイナリを作成しています。

ロギングが行われるかどうかを決定するビルド時の代わりに、実行時に環境変数またはプロパティ ファイルを使用するのはどうですか? このようにして、本番環境で問題が発生し、まったく同じバイナリを使用したい場合 (リビジョンを特定したり、コードをチェックアウトしたり、別の環境フラグで再構築したりする代わりに)、開発環境またはテスト環境に再デプロイするだけです。プロパティファイルまたは環境変数でデバッグを有効にしますか?

于 2009-10-29T03:18:48.667 に答える