2011-03-28 12 views
11

Tengo un archivo de compilación de hormigas que a menudo se ejecuta desde entornos muy diferentes. Por defecto, estoy buscando el mismo comportamiento que el uso de:Haz que la hormiga se silencie sin la bandera -q?

ant -q 

Sin embargo, dado que las configuraciones de algunos miembros del equipo varían, especificando la opción -q en el entorno de cada persona no se logra fácilmente de manera uniforme (algunas personas ejecutar hormiga del eclipse, algunos de la línea de comandos, algunos de depuración/herramientas de perfilado, etc. Cada uno con un método diferente para especificar los argumentos de hormigas como -q)

Así que estoy buscando una manera para el archivo de hormiga para llamar sí mismo silenciosamente ...

algo como lo siguiente sería ideal:

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

Puede alguien pensar en modos de lograr algo como esto? Todo lo que busco es que la compilación se ejecute silenciosamente siempre que se ejecute el objetivo predeterminado, independientemente de si se ha configurado -q.

Respuesta

19

Una opción podría ser establecer el nivel de registro dentro del destino.

Puede acceder a los registradores mediante una secuencia de comandos breve. Algo así como:

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

No estoy familiarizado con la forma en Eclipse llama hormiga, pero podría ser necesario iterar sobre todos los oyentes de construcción para conseguir 'silencio' durante todo.

Sugiera que, siempre que termine haciendo esto, haga que sea fácil volver a la ejecución detallada.

Editar - respuesta al comentario: Se puede acceder a las propiedades del proyecto dentro de la secuencia de comandos con 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> 

(Algo de edad) API docs are here, incluso para la project class.

+0

@martin: wow. Ni siquiera sabía que javascript podía usarse con Ant. Eso es increíble. Esto funcionó perfectamente, cuando utilicé * setMessageOutputLevel (1) *, solo se imprimieron mis comandos de eco. Eso es exactamente lo que estoy buscando. Ahora, todo lo que tengo que hacer es probar si esto funciona en los otros entornos desde los que ejecutamos Ant (línea de comando, eclipse, etc.) ... – gMale

+0

@martin: en la "línea 2" del script hay una manera de diga algo como, 'if (verboseFlagNotSet) logger.setMessageOutputLevel (1);' Es decir, ¿conoce una forma de verificar el estado del indicador detallado? – gMale

+0

@gmale - debería ser capaz de hacerlo. Agregué un ejemplo a la respuesta. Puede leer (y establecer) propiedades Ant desde dentro de JS. –

5

Para controlar el nivel de registro desde dentro de la secuencia de comandos de hormigas que podría tomar esta tarea sencilla =

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; 
     } 
    } 
} 

mapa a un taskdef y utilizarlo como ese =

<setloglevel level="error"/> 

... sólo errores debe aparecer

<setloglevel level="info" /> 

... Sobre el nivel de registro de nuevo

Eso es lo que hago para acortar los archivos de registro al usar tareas locuaces como, por ejemplo, f.e. tarea cvs

+0

No estoy familiarizado con la realización de este tipo de cosas (que se extiende a través de la hormiga java) pero voy a Google los detalles de cómo conseguir esto para trabajar y luego darle un intento ... – gMale

+0

Básicamente se trata de extender el org.apache.tools.ant.Task – Rebse

+1

Básicamente se trata de extender el org.apache.tools.ant.Task Normalmente tiene más de una tarea auto-escrita y ponerlos en un frasco. En este jar hay un xmlfile llamado antlib.xml que hace la asignación entre el nombre de la tarea y el nombre de clase. Pon el frasco a la vista para la hormiga, pero no simplemente en% ANT_HOME%/lib porque estás contaminando tu instalación de hormiga. Mejor poner algo en la carpeta ../extralibs y comenzar con la opción -lib path/to/extralibs. Luego, en su antscript, cargue sus tareas de la siguiente manera: Rebse

4

Después de leer la respuesta de Martin, creo que es más cómodo poner todo el material en un scriptdef.Aquí hay una solución con maravilloso =

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

Cada lenguaje de script que se ejecuta con la haba marco Scipting en Java VM se puede usar para las secuencias de hormiga con pleno acceso a la API de hormigas - es una cuestión de gusto. Usé Javascript, Beanshell, (J) ruby ​​antes y recientemente cambié a Groovy.

+3

+ 1 para hacerme pensar! jaja. Puedes usar groovy en un script de hormiga !!! que casi me hace babear. – gMale

+0

:-) Groovy incluso proporciona su propia tarea .... Además de groovy hay muchos otros lenguajes que se ejecutan a través de Bean Scripting Framework en Ant: (J) ruby, Beanshell, Javascript (Rhino de Mozilla), Jython, Judoscript. Un lenguaje para cada gusto/fetiche – Rebse

+3

por cierto. también hay al revés, usando Ant de Groovy, sin xml, see = http://groovy.codehaus.org/Using+Ant+from+Groovy – Rebse

5

Basándonos en las otras respuestas:

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

Fine, pero aún imprime el nombre del objetivo. – ceving

Cuestiones relacionadas