我有一个ant构建文件,它经常在非常不同的环境中运行。默认情况下,我正在寻找与使用相同的行为:
ant -q
但是,由于某些团队成员的配置不同,在每个人的环境中指定-q选项并不容易以统一的方式完成(有些人从eclipse运行ant,有些人从命令行运行,有些人从调试/分析工具运行,每个都有不同的方法来指定蚂蚁参数,如 -q )
所以我正在寻找一种方法让ant文件静静地调用本身
以下内容是理想的:
<target name="default">
<antcall quiet="yes" target="build" /> <!-- doesn't work -->
</target>
任何人都可以想到要做到这样的事情吗?无论是否设置了-q,无论何时运行默认目标,我所追求的只是让构建安静地运行。
答案 0 :(得分:20)
一个选项可能是在目标中设置日志记录级别。
您可以通过简短的脚本任务访问记录器。类似的东西:
<target ... >
<script language="javascript">
var logger = project.getBuildListeners( ).firstElement( );
logger.setMessageOutputLevel( 0 );
</script>
...
</target>
我不熟悉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>
(有点旧)API docs are here,包括project
class。
答案 1 :(得分: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;
}
}
}
将其映射到taskdef并使用它=
<setloglevel level="error"/>
...只列出错误
<setloglevel level="info" />
再次... loglevel信息
这就是我在使用像f.e这样的健谈任务时缩短日志文件的方法。 cvs任务
答案 2 :(得分: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>
答案 3 :(得分:4)
在阅读了马丁的回答之后,我认为将所有内容放在scriptdef中是最舒服的。这是一个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>
使用Java VM中的Bean Scipting Framework运行的每种脚本语言都可以用于ant的脚本,并且可以完全访问ant api - 这是一个品味问题。使用Javascript,Beanshell,(J)ruby之前和最近切换到Groovy。