我正在编写一个使用我的自定义扩展程序对象的gradle自定义插件。我明白我必须使用conventionMapping来懒惰地评估来自this SO answer和gradle forum的扩展对象值。
当我尝试使用普通的Gradle API(而不是 DSL API )编写插件时,会出现问题。我想我想这样做是因为它更适合IDE。所以任务创建就像这样完成:
MyTask task = project.tasks.create("mytask", MyTask)
task.?conventionMapping? ..
而不是
project.task(type:MyTask) {
conventionMapping.field = ..
}
MyTask正在扩展DefaultTask,因此它没有使用conventionMapping字段。然后我发现Gradle的Java插件中的一些Task实现正在扩展ConventionTask,我认为我应该扩展它,但不幸的是这些事实让我感到困惑:
我还发现this thread说我不应该约定。 所以我的问题是,ConvenMapping仍然是编写使用扩展的插件的正确方法吗?如果是,那么在没有gradle dsl魔法的情况下检索它们的正确方法是什么?
答案 0 :(得分:2)
会议映射是当前可用于解决"延迟配置的最强大的解决方案。问题,但它被认为是一个内部功能。在某些时候,它会偏向于新的配置模型(这将是一个公共功能)。同时,另一种解决方案是解决"延迟配置"问题是使用project.afterEvaluate { ... }
之类的回调。