是否有一种方法总是在结束的每个构建运行一个目标?
我知道我可以做这样的事情…
<target name="runJob" depends="actuallyRunJob, teardown"/>
…但这很草率,因为我需要为每个需要拆卸的目标提供一个包装器。
任何想法?
谢谢,罗伊
使用buildlistener,即execo -listener,它为每个构建结果
(build SUCCESSFUL | build FAILED)提供了一个任务容器,您可以将所有需要的任务放在
中有关详细信息,请参阅Ant中执行失败时的条件任务
或者滚动您自己的构建侦听器,参见=
http://ant.apache.org/manual/develop.html
以及ant安装中的API文档=
$ ANT_HOME/docs/手册/api/org/apache/tools/ant/BuildListener.html
与Rebse的回答相同,您可以用Javascript编写BuildListener,如下所示(如果您不介意将Ant扩展与makefile中的一些代码进行交换):
<project name="test-ant" default="build">
<target name="init">
<script language="javascript"> <![CDATA[
function noop () {}
var listener = new org.apache.tools.ant.BuildListener() {
buildFinished: function(e) {
project.executeTarget("_finally");
},
buildStarted: noop,
messageLogged: noop,
targetStarted: noop,
targetFinished: noop,
taskStarted: noop,
taskFinished: noop
}
project.addBuildListener(listener)
]]></script>
</target>
<target name="build" depends="init"/>
<target name="fail" depends="init">
<fail message="expected failure"/>
</target>
<target name="_finally">
<echo message="executing _finally target..."/>
</target>
</project>
如你所见,拦截其他事件应该很容易。
我也有类似的需求,最后编写了一个自定义任务,看起来像这样:
<!-- a task that executes the embedded sequential element at the end of the build,
but only if the nested condition is true; in this case, we're dumping out the
properties to a file but only if the target directory exists (otherwise, the clean
target would also generate the file and we'd never really be clean!) -->
<build:whendone>
<condition>
<available file="${project_target-dir}" />
</condition>
<sequential>
<mkdir dir="${project_final-build-properties-file}/.." />
<echoproperties destfile="${project_final-build-properties-file}" />
</sequential>
</build:whendone>
在这种情况下,我想要一个对构建做出贡献的所有Ant属性的记录,但是在构建开始时这样做会错过很多(如果它们被初始化为目标的一部分,在将它们转储到文件之后)。
不幸的是,我不能分享具体的代码,但这只不过是一个实现SubBuildListener
的Ant Task
,特别是buildFinished(BuildEvent)
。侦听器测试嵌入的条件,如果是true
,则执行嵌入的sequential
。
我想知道是否有更好的方法。
如果它是一个android项目,你可以很容易地覆盖"-post-build"目标在你的本地"build.xml"文件。