返回

解决 Gradle Convention 插件与全局任务可见性问题

Android

解决 Convention 插件与全局 Gradle 任务之间的可见性问题

问题陈述

当使用 Gradle 转换插件将项目从 buildSrc 迁移到 build-logic 时,你会遇到一个问题:从根目录注册的 Gradle 任务在 build-logic 目录中不可见。这可能阻碍从约定插件引用和使用任务,影响构建过程的效率。

问题根源

build-logic 目录包含项目特定的约定插件,这些插件定义了构建规则。但是,从根目录注册的 Gradle 任务与这些插件分开定义,导致它们在 build-logic 目录中不可见。

解决方案

解决此问题的两种方法:

方法 1:将任务移动到 ** build-logic 目录**

将任务移动到 build-logic 目录将使它们可见,并允许从约定插件引用。

方法 2:使用 Gradle API 访问任务

另一种方法是使用 Gradle API 从 build-logic 插件访问任务,允许通过程序方式访问任务。

步骤:

方法 1:

  1. build-logic 目录创建新类文件。
  2. 将任务逻辑移动到新类。
  3. 更新根目录的 build.gradle.kts 文件,从 build-logic 引用任务。

方法 2:

  1. build-logic 插件中添加代码以获取根目录的 Gradle 项目对象。
  2. 使用 rootProject 访问任务。

示例代码:

方法 2:

// build-logic/plugins/MyPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider

class MyPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        val rootProject = findProject(":")
        val myTask: TaskProvider<MyTask> = rootProject.tasks.named("myTask", MyTask::class.java)
        // ...
    }
}

注意事项:

  • build-logic 目录添加到项目的 settings.gradle 文件中。
  • 对于方法 2,需要在 build.gradle.kts 文件顶部添加特定代码。

结论

通过将任务移动到 build-logic 目录或使用 Gradle API 访问任务,你可以解决从 build-logic 目录访问全局 Gradle 任务的问题。这将提高构建过程的效率和可维护性。

常见问题解答

问:为什么需要解决此问题?

答:此问题阻碍了从约定插件访问全局 Gradle 任务,降低了构建过程的效率。

问:哪种方法更好?

答:根据具体情况选择方法,方法 1 更直接,而方法 2 更灵活。

问:是否需要将所有任务移动到 ** build-logic 目录?**

答:不,只有需要从 build-logic 插件访问的任务才需要移动。

问:如何确保任务在 ** build-logic 插件中可见?**

答:方法 1 通过移动任务确保可见性,方法 2 使用 Gradle API 访问任务。

问:是否有其他解决此问题的替代方法?

答:使用项目层 gradle 脚本或自定义 Gradle 插件可能是替代方法。