如何在不同的gradle任务之间共享参数

时间:2016-08-25 17:40:22

标签: java gradle groovy build

假设我有两个gradle任务:foobeforeFoo

毫不奇怪 - beforeFoo行动必须在foo之前完成,我有这个:

task foo << {
    dependsOn 'beforeFoo'
}

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

我已经尝试过:

1

foobeforeFoo在不同的.gradle文件中定义,而不是它们是root,因此不可能在任务之间重用project.ext.myInformation

2

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

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

没办法,如果在某个地方没有在当前的.gradle文件中定义,那么BeforeFooClass是不可见的

无法相信我无法轻易指定a.dependsOn b表达的争论。如果得到帮助,我会很高兴。

3 个答案:

答案 0 :(得分: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在执行阶段打印文本

答案 1 :(得分:0)

假设您有以下项目:

<强>的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 的属性周围添加"{ ->}" ext.someValue = "${ -> foo.someValue }"

    请参阅Closures in GStrings from Groovy documentation

  2. beforeFoo.gradle 中使用afterEvaluate阻止:

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

    <强> afterEvaluate (闭合)

         

    添加一个后立即调用的闭包   该项目已经过评估。该项目被传递到关闭   作为参数。这样的监听器在构建文件时得到通知   属于这个项目已经执行。父项目可能适合   示例将此侦听器添加到其子项目中。这样的倾听者可以   根据孩子的状态进一步配置这些子项目   项目构建文件运行后的项目。

         

    Gradle's Project API

  3. 结果是:

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

答案 2 :(得分:0)

的build.gradle

apply from: 'before.gradle'

task foo {
    dependsOn 'beforeFoo'
    doLast{
        println value
    }
}

before.gradle

task beforeFoo << {

    println value
}

gradle.properties

value=MyValue