首页 > 解决方案 > 如何使用 Gradle“平台”在多项目设置中对齐依赖版本?

问题描述

标签: gradlegradle-dependenciesgradle-multi-project-buildgradle-groovy-dsl

解决方案


我是否必须使用“java平台”插件?

不,如果您有非 Java 项目,那么您不应该使用 Java 平台插件。正如插件名称所示,它适用于 Java 项目。

Gradle 为 Java 项目提供了一个官方平台插件,但除此之外的任何东西,例如 C++/Swift,您都需要推出自己的插件/平台实现。您可以参考源代码来帮助您的实现。

即使我们都是 Java,对于任何一个项目,我们都不能为它的“api”和它的“运行时”有单独的版本</p>

您不需要为每个配置提供单独的版本。api扩展implementationruntimeClasspath( runtimeOnly) 从 扩展implementation。所以声明依赖api应该足够了。请参阅此处的依赖关系图。

Gradle 如何知道在使用平台的项目和平台规范之间匹配哪些配置的约束?

通过您在项目中指定它的方式以及 Java 平台插件的平台实现。例如,给定以下平台:

// my-platform

plugins {
    `java-platform`
}

dependencies {
    constraints {
        api("commons-httpclient:commons-httpclient:3.1")
    }
}

我可以在项目中执行以下任何操作:

dependencies {
    api(platform(":my-platform"))
    implementation(platform(":my-platform"))
    annotationProcessor(platform(":my-platform"))
}

我希望 Gradle 不会尝试通过简单的名称匹配将“api”与“api”匹配

根据使用情况进行匹配。看到条线和这些线。api只是为他们的插件选择的配置名称 Gradle,请参见此处。他们实际上可以选择任何名称,但更有可能选择api/runtime以保持与他们所拥有的相似的事物。

您将在平台上找到的大多数文档都是面向 Java 开发人员的。我相信这主要是因为平台的概念受到Maven 的 BOM 的极大启发

如果你真的想知道 Gradle 是如何在平台上做事的,那么要么痛苦地检查源代码,要么编写一个使用该平台的简单 Gradle 插件,然后使用GradleRunner编写一个测试并使用断点进行调试。示例插件可能是:

public class ExamplePlatformPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        project.getRepositories().mavenCentral();

        DependencyHandler dependencies = project.getDependencies();

        // api(platform(""org.springframework.boot:spring-boot-dependencies:2.2.6.RELEASE"")
        Dependency springBootPlatform = dependencies.platform("org.springframework.boot:spring-boot-dependencies:2.2.6.RELEASE");
        dependencies.add(JavaPlugin.API_CONFIGURATION_NAME, springBootPlatform);

        // api("org.apache.commons:commons-lang3")
        dependencies.add(JavaPlugin.API_CONFIGURATION_NAME, "org.apache.commons:commons-lang3");
    }
}

推荐阅读