Gradle 在自定义插件中检索conventionMapping
我正在编写一个gradle自定义插件,它使用我的自定义扩展对象。我明白了,我必须使用conventionMapping从和惰性地计算扩展对象值 当我试图用普通的GradleAPI(不是DSLAPI)编写插件时,就会出现问题。我想我之所以想这样做是因为它更为IDE友好。因此,任务创建是这样完成的:Gradle 在自定义插件中检索conventionMapping,gradle,Gradle,我正在编写一个gradle自定义插件,它使用我的自定义扩展对象。我明白了,我必须使用conventionMapping从和惰性地计算扩展对象值 当我试图用普通的GradleAPI(不是DSLAPI)编写插件时,就会出现问题。我想我之所以想这样做是因为它更为IDE友好。因此,任务创建是这样完成的: MyTask task = project.tasks.create("mytask", MyTask) task.?conventionMapping? .. 而不是 project.task(ty
MyTask task = project.tasks.create("mytask", MyTask)
task.?conventionMapping? ..
而不是
project.task(type:MyTask) {
conventionMapping.field = ..
}
MyTask正在扩展DefaultTask,因此它没有conventionMapping字段。然后我发现Gradle的Java插件中的一些任务实现是对ConventionTask的扩展,我认为我应该扩展ConventionTask,但不幸的是,这些事实再次让我感到困惑:
所以我的问题是,conventionMapping仍然是编写使用扩展的插件的正确方法吗?如果是,在没有gradle dsl魔力的情况下检索它们的正确方法是什么?约定映射是目前解决“延迟配置”问题的最强大的解决方案,但它被认为是一种内部功能。在某种程度上,它会倾向于新的配置模型(这将是一个公共特性)。同时,解决“延迟配置”问题的另一个解决方案是使用回调,例如
project.afterEvaluate{…}
使用afterEvaluate解决方案,我的自定义插件代码看起来非常干净。谢谢Peter。我想说清楚,我是否可以认为我们不应该使用conventionMapping,因为它们将来可能会被删除?此外,我在哪里可以获得有关此新配置模型的详细信息,Gradle 2.0中是否提供了这些信息?当使用内部功能时,通常的“使用风险自负”适用。约定映射肯定会消失,所以只要您可以不使用它,就不要使用它。新的配置模型是2.x的主题之一。它在2.0中不可用。@PeterNiederwieser是否有计划替换约定映射
?将某些内容延迟到后评估{}
中,这也使得将相关内容推送到那里成为必要。假设我的自定义插件添加了类型为Zip
的任务,并在afterEvaluate
中使用插件扩展中的值设置任务的baseName
。然后,使用此插件并引用任务(如myZipTask.archivePath
)的客户端项目将获得不正确的路径,除非archivePath
调用也在afterEvaluate
中完成。但是,客户不必事先猜测这些事情,是吗?有什么建议吗?@PeterNiederwieser你能举一个例子说明如何使用'afterEvaluate{}