没有-q标志让蚂蚁安静吗?

gMa*_*ale 12 ant build-process build

我有一个ant构建文件,通常在非常不同的环境中运行.默认情况下,我正在寻找与使用相同的行为:

ant -q
Run Code Online (Sandbox Code Playgroud)

但是,由于某些团队成员的配置不同,在每个人的环境中指定-q选项并不容易以统一的方式完成(有些人从eclipse运行ant,有些人从命令行运行,有些人从调试/分析工具运行等等.与用于指定像蚂蚁参数不同的方法-q)

所以我正在寻找一种让ant文件静静地调用自己的方法 ......

像下面这样的东西是理想的:

<target name="default">
    <antcall quiet="yes" target="build" /> <!-- doesn't work -->
</target>
Run Code Online (Sandbox Code Playgroud)

任何人都可以想到要做到这样的事情吗?无论是否设置了-q,只要运行默认目标,我所追求的就是让构建安静地运行.

mar*_*ton 20

一种选择可能是在目标中设置日志记录级别.

您可以通过简短的脚本任务访问记录器.就像是:

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

我不熟悉Eclipse如何调用Ant,但可能需要遍历所有构建侦听器以获得全面的"静音".

建议你最终如何做到这一点,你可以轻松切换回详细运行.

编辑 - 对评论的响应:您可以使用以下命令从脚本中访问项目属性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>
Run Code Online (Sandbox Code Playgroud)

(有点旧)API文档在这里,包括project课程.


Reb*_*bse 5

为了从你的ant脚本中控制loglevel,你可以采取这个简单的任务=

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将它映射到taskdef并像那样使用它=

<setloglevel level="error"/>
Run Code Online (Sandbox Code Playgroud)

......只应列出错误

<setloglevel level="info" />
Run Code Online (Sandbox Code Playgroud)

...再次提供loglevel信息

这就是我在使用像fe cvs task这样的健谈任务时缩短日志文件的方法


Vad*_*zim 5

基于其他答案:

<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>
Run Code Online (Sandbox Code Playgroud)