Gradle 在自定义插件中检索conventionMapping

Gradle 在自定义插件中检索conventionMapping,gradle,Gradle,我正在编写一个gradle自定义插件,它使用我的自定义扩展对象。我明白了,我必须使用conventionMapping从和惰性地计算扩展对象值 当我试图用普通的GradleAPI(不是DSLAPI)编写插件时,就会出现问题。我想我之所以想这样做是因为它更为IDE友好。因此,任务创建是这样完成的: MyTask task = project.tasks.create("mytask", MyTask) task.?conventionMapping? .. 而不是 project.task(ty

我正在编写一个gradle自定义插件,它使用我的自定义扩展对象。我明白了,我必须使用conventionMapping从和惰性地计算扩展对象值

当我试图用普通的GradleAPI(不是DSLAPI)编写插件时,就会出现问题。我想我之所以想这样做是因为它更为IDE友好。因此,任务创建是这样完成的:

MyTask task = project.tasks.create("mytask", MyTask)
task.?conventionMapping? ..
而不是

project.task(type:MyTask) {
   conventionMapping.field = ..
}
MyTask正在扩展DefaultTask,因此它没有conventionMapping字段。然后我发现Gradle的Java插件中的一些任务实现是对ConventionTask的扩展,我认为我应该扩展ConventionTask,但不幸的是,这些事实再次让我感到困惑:

  • ConventionTask包是内部的
  • DefaultTask用@NoConventionMapping注释
  • 我还发现说我不应该违反惯例。
    所以我的问题是,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{}