2009-10-28 2 views
1

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

Благодаря

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

Я предполагаю, что создание отдельного макроса для обработки этого недопустимо? – jheddings

ответ

3

Они могут быть несколько способов решить эту проблему, но ни один не так прост, как с помощью элемента муравей-вно. Я не уверен, что это даст вам то, что вам нужно для вашей заявки, но вы можете попробовать следующее:

Использование условных целей. Если вы можете заменить свой макродед на цель для вызова, это может сработать для вас. Обратите внимание, что это будет определять свойство глобально, поэтому оно может не работать для вашего приложения.

<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.jar. Вы можете поместить его под папку «инструменты» и вытащить его в использовании taskdef:

<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/tools/ant-contrib.jar" /> 
+0

Я решил принять ваш совет и добавил библиотеку ant-contrib. – Steve

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> 
+0

Хороший вклад в фильтрацию ... Я пытался сосредоточиться на части «использования основных задач». – jheddings

0

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

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

+0

На самом деле мы разрабатываем приложение Javascript TV Widget с некоторыми серьезными ограничениями производительности, поэтому мы пытаемся удалить лишний материал, который мы можем. – Steve

+0

А, для JavaScript, я вижу, хотел бы, чтобы ваши функции были маленькими и худшими. –

Смежные вопросы