在每次构建结束时运行一个目标



是否有一种方法总是在结束的每个构建运行一个目标?

我知道我可以做这样的事情…

<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"文件。

相关内容

  • 没有找到相关文章

最新更新