Gradle 插件开发:解决工具工件的惯用方法

Gradle Plugin Development: Idiomatic way of resolving tool artefacts

开发 Gradle 插件的完全新手。

我正在为定制的人工制品打包工具开发插件。该工具在 Maven 存储库中作为一个 fat jar 可用。有不止一种类型的工具可以完成这项工作,因此插件需要确定它需要哪一种,并向任务图中添加一个解决步骤。

我想我需要:

  1. 为插件创建配置(“pluginXTools”)
  2. 找出我需要的工件并将其添加到 DependencyResolutionListener::beforeResolve
  3. 在我的插件打包任务中添加对解析步骤的依赖。

如何将人工制品分辨率连接到我的任务,使其成为构建图的一部分?有人可以向我展示我想要实现的目标的框架

我在 Gradle slack 中询问并查看了一些现有插件。 Gradle 中解决工具依赖关系的约定是使用插件 API 注册一个隐藏的配置与所需的依赖关系。

以下 Kotlin 片段显示了为特定工具注册配置所需的内容:

project.configurations.create("someInternalConfigName").apply {
      isVisible = false
      isTransitive = false
      description = "My internal config for resolving tool"
      defaultDependencies { deps ->
        deps.add(
          project.dependencies.create("my.compiler:the-compiler:1.2.3")
        )
      }
    }

在任务执行期间,您可以执行以下操作:

  private fun resolveCompilerTool(task: Task): URL =
    task.project.configurations.getAt("someInternalConfigName").let {
      it.resolve()
      assert(it.files.size == 1) { "expect a single dependency file" }
      it.files.first().toURI().toURL()
    }