Тестирование атрибута Macrodef без IF - PullRequest
1 голос
/ 28 октября 2009

Я пытаюсь удалить все строки, которые начинаются с log , если для атрибута macrodef установлено значение prod (пример ниже). Я планирую использовать replaceregexp для удаления всех строк, начинающихся с журнала. Однако я не уверен, как проверить, задан ли для атрибута конкретное значение, кроме использования задачи if . Я бы не хотел вводить какие-либо неосновные задачи Ant для этого, но я не могу придумать какие-либо другие решения. Есть ли у меня какие-либо другие варианты, кроме использования if-задачи?

Спасибо

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

Ответы [ 3 ]

5 голосов
/ 29 октября 2009

Вы должны использовать ссылку на параметр, например, @{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>
3 голосов
/ 29 октября 2009

Это может быть несколько способов решить эту проблему, но ни один из них не так прост, как использование элемента 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:

<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/tools/ant-contrib.jar" />
0 голосов
/ 29 октября 2009

Похоже, когда вы создаете свой проект специально для вашей производственной среды - вы убираете код, который не хотите запускать в производственной среде. Таким образом, вы создаете бинарный файл, отличный от того, что будет работать в вашей среде разработки или тестирования.

Как насчет использования переменной среды или файла свойств во время выполнения вместо времени сборки, которое определяет, происходит ли запись в журнал? Таким образом, когда у вас возникают проблемы в Production и вы хотите использовать один и тот же точный двоичный файл (вместо определения редакции, проверки кода, перестройки с другим флагом среды) вы просто повторно развертываете его в своей среде разработки или тестирования и включить отладку в файле свойств или переменной среды?

...