【问题标题】:How to share parameters between different gradle tasks如何在不同的gradle任务之间共享参数
【发布时间】:2016-08-25 17:40:21
【问题描述】:

假设我有两个 gradle 任务:foobeforeFoo

不足为奇 - beforeFoo 操作必须在 foo 之前完成,我有这个:

task foo << {
    dependsOn 'beforeFoo'
}

比我开始觉得我的beforeFoo 应该得到一些信息 foo 可见,beforeFoo 不可见,我需要以某种方式通过它。在单独的 .gradle 文件中定义的任务,这些文件由根 build.gradle 通过 apply from 表达式链接在一起。

我已经尝试过的:

1

foobeforeFoo 定义在不同的 .gradle 文件中,并且它们都不是 root,因此无法在任务之间重用 project.ext.myInformation

2

使 'beforeFoo' 成为 DefaultTask 的扩展类并创建类似

task `beforeFoo` (type: BeforeFooClass){
   myInfo='info'
}

不可能,如果 BeforeFooClass 定义在当前 .gradle 文件之外的某个地方,则它是不可见的

不敢相信我不能轻易地为a.dependsOn b 表达式指定争论。如果能得到帮助,我会很高兴。

【问题讨论】:

    标签: java gradle groovy build


    【解决方案1】:

    我可能不明白这个问题,但给出build.gradle

    apply from: 'before.foo.gradle'
    apply from: 'foo.gradle'
    

    before.foo.gradle:

    task beforeFoo() << {
        println "executing beforeFoo"
        println "value is: " + project.ext.value
    }
    

    foo.gradle(“配置”阶段和“执行”阶段的代码分开):

    task foo(dependsOn: "beforeFoo") {
        println "configuring foo"
        project.ext.value = "is set by foo"
    }
    
    foo << {
        println "executing foo"
    }
    

    观察这个结果:

    bash$ gradle foo
    configuring foo
    :beforeFoo
    executing beforeFoo
    value is: is set by foo
    :foo
    executing foo
    

    即:

    • foo在配置阶段设置值
    • beforeFoo 报告执行阶段的值
    • foo 在执行阶段打印文本

    【讨论】:

    • project.ext 的范围和寿命我不清楚。例如,如果我有另一个任务 bar,它看起来与 foo 完全相同,但将 project.ext.value 设置为另一个值,会发生什么情况。 foobar 会破坏 project.ext.value 的值吗?
    【解决方案2】:

    假设您有以下项目:

    build.gradle

    apply from: 'beforeFoo.gradle'
    apply from: 'foo.gradle'
    

    beforeFoo.gradle

    task beforeFoo {
      ext.someValue = foo.someValue
      doLast {
        println someValue
      }
    }
    

    foo.gradle

    task foo {
      dependsOn 'beforeFoo'
      ext.someValue = "I'm value from foo"
    }
    

    当你尝试执行foo 任务时,你会得到输出:

    $ gradle foo
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Script 'beforeFoo.gradle' line: 2
    
    * What went wrong:
    A problem occurred evaluating script.
    > Could not get unknown property 'foo' for task ':beforeFoo' of type org.gradle.api.DefaultTask.
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
    
    BUILD FAILED
    
    Total time: 2.488 secs
    

    对于这种情况,您有两种选择:

    1. 使用 groovy 的lazyGString:只需在 foo 的属性周围添加 "{ -&gt;}" ext.someValue = "${ -> foo.someValue }"

      Closures in GStrings from Groovy documentation

    2. beforeFoo.gradle 中使用 afterEvaluate 块:

      afterEvaluate {
        task beforeFoo {
          ext.someValue = foo.someValue
          doLast {
            println someValue
          }
        }
      }
      

      评估后(关闭)

      添加一个闭包,之后立即调用 这个项目已经过评估。项目传递到关闭 作为参数。当构建文件时,此类侦听器会收到通知 属于这个项目的已经执行。父项目可能用于 示例将这样的侦听器添加到其子项目中。这样的听众可以 根据孩子的状态进一步配置那些孩子项目 构建文件运行后的项目。

      Gradle's Project API

    结果是:

    $ gradle foo
    :beforeFoo
    I'm value from foo
    :foo
    
    BUILD SUCCESSFUL
    
    Total time: 2.449 secs
    

    【讨论】:

      【解决方案3】:

      build.gradle

      apply from: 'before.gradle'
      
      task foo {
          dependsOn 'beforeFoo'
          doLast{
              println value
          }
      }
      

      before.gradle

      task beforeFoo << {
      
          println value
      }
      

      gradle.properties

      value=MyValue
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多