gpt4 book ai didi

gradle - 如何使用Gradle “platforms”在多项目设置中对齐依赖项版本?

转载 作者:行者123 更新时间:2023-12-03 05:05:00 25 4
gpt4 key购买 nike

我正在尝试学习如何使用“平台”在多项目设置中的项目之间对齐依赖项版本。到目前为止,我已经看到:

  • https://docs.gradle.org/6.2.1/userguide/platforms.html
  • https://docs.gradle.org/6.2.1/userguide/dependency_management_terminology.html#sub::terminology_platform
  • https://docs.gradle.org/6.2.1/userguide/dependency_version_alignment.html#sec:virtual_platform
  • https://docs.gradle.org/6.2.1/userguide/dependency_constraints.html#sec:adding-constraints-transitive-deps
  • https://docs.gradle.org/6.2.1/userguide/java_platform_plugin.html
  • …以及其他一些外部网站试图查找示例,例如
    https://dzone.com/articles/gradle-goodness-use-bill-of-materials-bom-as-depen

  • 我了解如何在项目中声明约束。我想我也了解如何为此目的使用BOM。但是,我想为此目的使用“强制平台项目”,并且我在这里不了解很多事情:
  • 我是否必须使用“java平台”插件? 我们有非Java项目。我们的配置不太适合“api”和“运行时”存储桶。
  • 即使我们都是Java,对于任何一个项目,我们都无法为其“api”及其“运行时” 拥有单独的版本。虽然我确实了解在某些情况下这可能提供的控制级别,但我不了解它们是如何协同工作以确保项目获得指定的依赖关系的。
  • Gradle如何知道使用平台的项目和平台规范之间要匹配的配置约束? 我想我看到了在平台上定义“api”和其他约束的示例,并且我“理解”了项目将通过声明api platform(project(':platform'))引用此示例。我希望Gradle不会尝试通过简单的名称匹配将“api”与“api”进行匹配。我需要多个不同的依赖项配置,以使其与同一个平台的“配置”(无论其名称如何)保持一致。

  • 通常,我找不到足够的信息来对它的功能或工作方式充满信心。有人可以填补空白还是将我指向某些文档,其中提供了比上述示例更多的示例和详细信息?目前,我不知道我应该为该平台项目实际写些什么(它的 build.gradle)和/或如何从当前的现有项目中正确地引用它。

    谢谢!

    更新1:在 https://discuss.gradle.org/t/can-someone-tell-me-what-i-am-doing-wrong-to-align-dependency-versions-across-projects/35601上发布了一个最小的实验来测试我对此的理解(缺乏)...

    最佳答案

    Do I have to use a “java platform” plugin or not?



    否。如果您有非Java项目,则不应使用Java平台插件。如插件名称所示,它用于Java项目。

    Gradle提供了一个用于Java项目的官方平台插件,但是除C++ / Swift之外的任何东西,您都需要滚动自己的平台插件/实现。您可以引用 source code来帮助您实现。

    Even if we were all Java, for any one project, we can’t have separate versions for its “api” and for its “runtime”



    您无需为每个配置使用单独的版本。 api扩展了 implementation,而 runtimeClasspath( runtimeOnly)从 implementation扩展了。因此,声明 api的依赖关系就足够了。请引用依赖图 here

    How does Gradle know which configurations’ constraints to match between the project using the platform and the platform specifications?



    通过如何在项目中指定它以及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"))
    }

    I hope Gradle isn’t trying to match “api” to “api” by simple name matching



    根据使用情况进行匹配。请参见 this行和 these行。 api只是为其插件选择的配置名称Gradle,请参阅 here。他们实际上可以选择任何名称,但是更有可能选择了 api / runtime来使事物与他们拥有的相似。

    您将在平台上找到的大多数文档都是针对Java开发人员的。我相信这主要是由于平台概念受 Maven's 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");
    }
    }

    关于gradle - 如何使用Gradle “platforms”在多项目设置中对齐依赖项版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61083954/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com