假设我有两个gradle任务:foo
和beforeFoo
。
毫不奇怪 - beforeFoo
行动必须在foo
之前完成,我有这个:
task foo << {
dependsOn 'beforeFoo'
}
我开始觉得我的beforeFoo
应该得到一些信息
这对于foo
是可见的,不适用于beforeFoo
,我需要以某种方式传递它。在单独的.gradle文件中定义的任务,这些文件由root build.gradle 按apply from
表达式链接在一起。
我已经尝试过:
1
foo
和beforeFoo
在不同的.gradle文件中定义,而不是它们是root,因此不可能在任务之间重用project.ext.myInformation
2
使'beforeFoo'扩展为DefaultTask
的类并创建类似
task `beforeFoo` (type: BeforeFooClass){
myInfo='info'
}
没办法,如果在某个地方没有在当前的.gradle文件中定义,那么BeforeFooClass是不可见的
无法相信我无法轻易指定a.dependsOn b
表达的争论。如果得到帮助,我会很高兴。
答案 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
对于这种情况,您有两种选择:
使用groovy的lazyGString:只需在 foo 的属性周围添加"{ ->
和}"
:
ext.someValue = "${ -> foo.someValue }"
在 beforeFoo.gradle 中使用afterEvaluate
阻止:
afterEvaluate {
task beforeFoo {
ext.someValue = foo.someValue
doLast {
println someValue
}
}
}
<强> afterEvaluate 强>(闭合)
添加一个后立即调用的闭包 该项目已经过评估。该项目被传递到关闭 作为参数。这样的监听器在构建文件时得到通知 属于这个项目已经执行。父项目可能适合 示例将此侦听器添加到其子项目中。这样的倾听者可以 根据孩子的状态进一步配置这些子项目 项目构建文件运行后的项目。
结果是:
$ gradle foo
:beforeFoo
I'm value from foo
:foo
BUILD SUCCESSFUL
Total time: 2.449 secs
答案 2 :(得分:0)
apply from: 'before.gradle'
task foo {
dependsOn 'beforeFoo'
doLast{
println value
}
}
task beforeFoo << {
println value
}
value=MyValue