Сделать муравья тихим без флага -q? - PullRequest
12 голосов
/ 28 марта 2011

У меня есть файл сборки ant, который часто запускается из совершенно разных сред.По умолчанию я ищу то же поведение, что и при использовании:

ant -q

Однако, поскольку конфигурации некоторых членов команды различаются, указание параметра -q в среде каждого человека не так легко выполнить единообразным способом (некоторые запускают ant из eclipse, некоторые из командной строки, некоторые из средств отладки / профилирования и т. д. У каждого из них свой метод указания аргументов ant, например -q )

Так что я ищу способ, чтобы муравейник мог сам вызывать спокойно ...

Идеально было бы что-то вроде следующего:

<target name="default">
    <antcall quiet="yes" target="build" /> <!-- doesn't work -->
</target>

Кто-нибудь может придумать, как добиться чего-то подобного?Все, что мне нужно, это чтобы сборка работала тихо, когда запускается цель по умолчанию, независимо от того, установлена ​​ли -q.

Ответы [ 4 ]

20 голосов
/ 29 марта 2011

Одним из вариантов может быть установка уровня ведения журнала изнутри цели.

Доступ к регистраторам можно получить с помощью короткой задачи сценария.Что-то вроде:

<target ... >
    <script language="javascript">
        var logger = project.getBuildListeners( ).firstElement( );
        logger.setMessageOutputLevel( 0 );
    </script>
    ...
</target>

Я не знаком с тем, как Eclipse вызывает Ant, но может потребоваться перебрать все слушатели сборки, чтобы получить 'тишину' вокруг.

Suggestчто, как только вы в конечном итоге делаете это, вы облегчаете переключение обратно на многословный запуск.

Редактирование - ответ на комментарий: Вы можете получить доступ к свойствам проекта из скрипта, используя project.getProperty():

<property name="verboseFlag" value="1" />
<script language="javascript">
    var logger = project.getBuildListeners().firstElement();
    var verboseMode = project.getProperty( "verboseFlag" )
    if ( ! "1".equals( verboseMode ) )
        logger.setMessageOutputLevel( 0 );
</script>

(несколько устаревший) Документы API здесь , в том числе для project класса .

5 голосов
/ 04 октября 2013

На основе других ответов:

<macrodef name="quiet">
    <element name="body" implicit="yes"/>
    <sequential>
        <script language="javascript">
            project.getBuildListeners().firstElement().setMessageOutputLevel(0);
        </script>
        <body/>
        <script language="javascript">
            // TODO: restore last log level
            project.getBuildListeners().firstElement().setMessageOutputLevel(2);
        </script>
    </sequential>
</macrodef>

<target name="test-quiet">
    <quiet>
        <echoproperties/>
    </quiet>
</target>
5 голосов
/ 28 марта 2011

Для управления уровнем логики из вашего скрипта ant вы можете выполнить эту простую задачу =

public class SetLogLevel extends Task
{
    private int logLevel = -1;

    public void execute()
    {
        if (logLevel == -1)
        {
            throw new BuildException("Error - No Loglevel specified !!");
        }
        Vector listeners = this.getProject().getBuildListeners();
        for (Iterator i = listeners.iterator(); i.hasNext();)
        {
            BuildListener listener = (BuildListener) i.next();
            if (listener instanceof BuildLogger)
            {
                BuildLogger logger = (BuildLogger) listener;
                logger.setMessageOutputLevel(logLevel);
            }
        }
    }

    /**
     * 
     *  @see org.apache.tools.ant.taskdefs.Echo$EchoLevel
     * 
     */

    public void setLevel(EchoLevel echoLevel) {
        String option = echoLevel.getValue();
        if (option.equals("error")) {
            logLevel = Project.MSG_ERR;
        } else if (option.equals("warning")) {
            logLevel = Project.MSG_WARN;
        } else if (option.equals("info")) {
            logLevel = Project.MSG_INFO;
        } else if (option.equals("verbose")) {
            logLevel = Project.MSG_VERBOSE;
        } else {
            // must be "debug"
            logLevel = Project.MSG_DEBUG;
        }
    }
}

сопоставьте его с taskdef и используйте его так =

<setloglevel level="error"/>

... должны быть указаны только ошибки

<setloglevel level="info" />

... снова информация уровня журнала

Это то, что я делаю, чтобы сократить файлы журналов при использовании разговорных задач, таких как, например, f.e. cvs task

4 голосов
/ 30 марта 2011

Прочитав ответ Мартина, я думаю, что наиболее удобно поместить весь материал в скрипт.Вот решение с groovy =

<project>

  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>

  <!-- testproperty referenced from verboseflag attribute 
       comment out to make it unset -->
  <property name="someverboseflag" value="whatever"/>

    <scriptdef name="setloglevel" language="groovy">
      <attribute name="loglevel"/>
      <attribute name="verboseflag"/>

     switch (attributes.'loglevel') {
        case 'error':
          project.getBuildListeners()[0].setMessageOutputLevel(0)
          break
        case 'warn':
          project.getBuildListeners()[0].setMessageOutputLevel(1)
          break
        case 'info':
          project.getBuildListeners()[0].setMessageOutputLevel(2)
          break
        case 'verbose':
          project.getBuildListeners()[0].setMessageOutputLevel(3)
          break
        case 'debug':
          project.getBuildListeners()[0].setMessageOutputLevel(4)
          break
     }

        if (project.getProperty(attributes.'verboseflag') == null)
        {
          println "Property " + attributes.'verboseflag' + " not set, default => Loglevel WARN !"   
          project.getBuildListeners()[0].setMessageOutputLevel(1)
        }
  </scriptdef>

    <!-- the loglevel given in attribute loglevel is only used
         when verboseflag attribute is set, otherwise
         loglevel WARN is used -->
    <setloglevel loglevel="debug" verboseflag="someverboseflag"/>

    <!-- test -->
    <echo level="error">getting logged when Loglevel ERROR and higher..</echo>
    <echo level="warning">getting logged when Loglevel WARN and higher..</echo>
    <echo level="info">getting logged when Loglevel INFO and higher..</echo>
    <echo level="verbose">getting logged when Loglevel VERBOSE and higher..</echo>
    <echo level="debug">getting logged when Loglevel DEBUG..</echo>

</project>

Каждый язык сценариев, работающий с Bean Scipting Framework в Java VM, может использоваться для сценариев в ant с полным доступом к ant api - это дело вкуса.Ранее использовал Javascript, Beanshell, (J) ruby ​​и недавно переключился на Groovy.

...