按顺序调用子项目和其他任务的Gradle批处理任务 [英] Gradle batch task that invokes subproject and other tasks in order

查看:488
本文介绍了按顺序调用子项目和其他任务的Gradle批处理任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为多模块项目编写gradle 1.4构建文件。所以有根 build.gradle 定义如下:

 子项目{
apply插件:'java'
...

定义构建所有子模块的任务。子模块包含在 settings.gradle 中,每个模块的构建文件都具有已定义的依赖关系。



到目前为止, )现在,在主构建文件中,我添加了一些额外的项目范围任务,如: aggregateJavadoc (将所有javadoc合并为一个)或者 bundleJar 所有类)等等。每一个在手动调用时都有效。



现在我需要一个发布任务


  • 构建所有子模块(如从命令行调用 - 意味着,我不想为每个子模块手动编写execute())

  • >
  • 调用额外的任务(使用execute()我假设)。 我试过 dependsOn ,但没有遵循列出的任务的顺序。另外,依赖模块似乎在发布任务执行后执行。我尝试了其他几个想法,但都失败了。

    问题:创建这样一个批处理任务的最佳方法是什么?它必须调用所有子模块还需要执行一些更多的任务?什么是最好的,对Gradle友好的解决方案? Thanx!

    解决方案


    $ b $所以,我们有很多模块。现在,让我们创建额外的任务,这些任务依赖于正在构建的模块:

     任务aggregateJavadoc(类型:Javadoc){
    dependsOn subprojects.build

    任务bundleJar(类型:Jar){
    dependsOn subprojects.build

    最后,我们的 release 任务看起来像这样:

      task release(){
    dependsOn subprojects.build
    dependsOn aggregateJavadoc
    dependsOn bundleJar
    ...
    }

    这将首先构建子项目;不是因为它首先被列出,而是因为额外的任务取决于建筑。额外任务的顺序并不重要。这对我最有意义。



    编辑
    如果你的一个子项目(即模块)是非java模块,那么你将遇到一个问题这个项目。我所做的就是对子模块进行分组,如下所示:

      def javaModules(){
    subprojects.findAll {it。 name.contains('jodd-')}
    }

    然后改为引用子项目,无处不在使用 javaModules !例如:

      configure(javaModules()){
    apply plugin:'java'
    .. 。

     < code $> 




















    $ b

    btw,对于所有那些依赖于建筑物的附加项目,我使用这个'dummy'任务 prj 作为 dependsOn ,以防止重复。


    I am writing gradle 1.4 build file for multimodule project. So there is root build.gradle that defines something like:

    subprojects {
        apply plugin: 'java'
        ...
    

    which defines build task for all submodules. Submodules are included in settings.gradle and each module has its build file with defined dependencies.

    Everything by-the-book, so far:) Now, in the main build file I've added some additional project-scope tasks, like: aggregateJavadoc (collects all javadocs into one) or bundleJar (creates bundle jar from all classes), etc. Each on works when invoked manually.

    Now I need a task release that will

    • build all submodules (as invoked from command line - meaning, i dont want to manually write execute() for each submodule)

    • invoke additional tasks (using execute() I presume).

    I tried dependsOn but the order of listed tasks is not followed. Also, dependent modules seems to be executed after release task execution. I tried several other ideas and failed.

    Question: what would be the best way to create such batch task, that has to invoke something on all submodules and additionally to perform some more tasks? What would be the best gradle-friendly solution? Thanx!

    解决方案

    It happened that this can be solved with simple dependency management.

    So, we have many modules. Now, lets create additional tasks that depends on modules being build:

    task aggregateJavadoc(type: Javadoc) {
        dependsOn subprojects.build
    
    task bundleJar(type: Jar) {
        dependsOn subprojects.build
    

    Finally, our release task would simply look like this:

    task release() {
        dependsOn subprojects.build
        dependsOn aggregateJavadoc
        dependsOn bundleJar
        ...
    }
    

    This will build subprojects first; not because it is listed first, but because additional tasks depends on building. Order of additional task is not important. This make sense the most to me.

    EDIT if one of your subprojects (i.e. modules) is non-java module, then you will have a problem building this project. What I do is to group submodules, like this:

    def javaModules() {
        subprojects.findAll {it.name.contains('jodd-')}
    }
    

    and then instead to refer to subprojects, use javaModules everywhere! For example:

    configure(javaModules()) {
        apply plugin: 'java'
        ...
    

    and

    task prj {
        dependsOn javaModules().build
    }
    

    btw, I am using this 'dummy' task prj for dependsOn on all those additional projects that depends on building, to prevent repeating.

    这篇关于按顺序调用子项目和其他任务的Gradle批处理任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆