我正在关注Gradle文档的Writing Custom Plugins部分,特别是关于Getting input from the build的部分。文档提供的以下示例完全按预期工作:
apply plugin: GreetingPlugin
greeting.message = 'Hi from Gradle'
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
// Add the 'greeting' extension object
project.extensions.create("greeting", GreetingPluginExtension)
// Add a task that uses the configuration
project.task('hello') << {
println project.greeting.message
}
}
}
class GreetingPluginExtension {
def String message = 'Hello from GreetingPlugin'
}
输出:
> gradle -q hello
Hi from Gradle
我希望让自定义插件执行外部命令(使用Exec task),但是在将任务更改为某种类型(包括Exec以外的类型,例如Copy)时,构建的输入停止正常工作:
// previous and following sections omitted for brevity
project.task('hello', type: Exec) {
println project.greeting.message
}
输出:
> gradle -q hello
Hello from GreetingPlugin
有谁知道这个问题是什么?
答案 0 :(得分:1)
它与任务的类型无关,它是典型的<<
误解。
撰写时
project.task('hello') << {
println project.greeting.message
}
并执行gradle hello
,会发生以下情况:
配置阶段
执行阶段
println project.greeting.message
} 在这种情况下,输出是来自Gradle的Hi
撰写时
project.task('hello', type: Exec) {
println project.greeting.message
}
并执行gradle hello
,发生以下情况
配置阶段
println project.greeting.message
剩下的工作流程并不重要。
<小时/> 所以,小细节很重要。 Here's对同一主题的解释。
<强>解决方案:强>
void apply(Project project) {
project.afterEvaluate {
project.task('hello', type: Exec) {
println project.greeting.message
}
}
}