Как использовать «платформы» Gradle для выравнивания версий зависимостей в многопроектной установке? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь научиться использовать «платформы» для выравнивания версий зависимостей между проектами в многопроектной установке. До сих пор я видел:

  1. https://docs.gradle.org/6.2.1/userguide/platforms.html
  2. https://docs.gradle.org/6.2.1/userguide/dependency_management_terminology.html#sub :: terminology_platform
  3. https://docs.gradle.org/6.2.1/userguide/dependency_version_alignment.html#sec: виртуальная_платформа
  4. https://docs.gradle.org/6.2.1/userguide/dependency_constraints.html#sec: добавление-переходы-переходы
  5. https://docs.gradle.org/6.2.1/userguide/java_platform_plugin.html
  6. … и некоторые другие внешние сайты, пытающиеся найти примеры, такие как https://dzone.com/articles/gradle-goodness-use-bill-of-materials-bom-as-depen

Я понимаю, как я могу объявить ограничения в проекте. Я думаю, что я также понимаю, как использовать спецификации для этой цели. Тем не менее, я хотел бы использовать «проект платформы с принуждением» для этой цели, и я не понимаю здесь несколько вещей:

  1. Должен ли я использовать «java плагин платформы или нет? У нас есть не Java проекты. Наши конфигурации не совсем вписываются в корзины «api» и «runtime».
  2. Даже если бы мы все были Java, для любого проекта у нас не было бы отдельных версий для его проекта. «Api» и его «время выполнения» . Хотя я понимаю уровень контроля, который может быть предложен в некоторых случаях, я не понимаю, как они предназначены для совместной работы, чтобы убедиться, что проект получает заданную зависимость.
  3. Как работает Gradle знаете, какие ограничения конфигурации соответствуют проекту между платформой и спецификациями платформы? Мне кажется, я видел примеры, определяющие «api» и другие ограничения в платформе, и «понимаю», что проекты будут ссылаться на это, объявив платформа API (проект (': платформа')). Я надеюсь, что 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 ...

1 Ответ

0 голосов
/ 08 апреля 2020

Нужно ли использовать плагин «java платформа» или нет?

Нет. Если у вас не Java проекты, вам не следует использовать плагин Java. Как видно из названия плагина, он предназначен для Java проектов.

Gradle предлагает официальный плагин для платформы для Java проектов, но для чего-то помимо этого, такого как C ++ / Swift, вам нужно будет свернуть свой собственный плагин / реализация платформы. Вы можете обратиться к исходному коду , чтобы помочь с вашей реализацией.

Даже если бы мы все были Java, для любого одного проекта у нас не может быть отдельных версий для его «api» и его «время выполнения»

Вам не нужно иметь отдельные версии для каждой конфигурации. api расширяется implementation, а runtimeClasspath (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

Если вы действительно хотите знать, как 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");
    }
}
...