在没有IF的情况下测试Macrodef属性

时间:2009-10-28 17:54:14

标签: ant ant-contrib

如果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>

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

处理“其他”案例。如果您需要处理其他案例,则需要提供一些目标......

<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:

将其拉入
<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/tools/ant-contrib.jar" />

答案 2 :(得分:0)

看起来,当您专门为生产环境构建项目时 - 您正在剥离您不想在生产中运行的代码。因此,您创建的二进制文件与在Dev或Testing环境中运行的二进制文件不同。

如何在运行时使用环境变量或属性文件而不是生成时间来确定是否发生日志记录?这样,当您在生产中遇到问题并且想要使用相同的二进制文件(而不是确定修订版,检查代码,使用不同的环境标志进行重建)时,您只需将其重新部署到Dev或Test环境中并打开属性文件或环境变量中的调试?