Почему Gradle не использует репозитории Maven, объявленные в pom.xml плагина? - PullRequest
1 голос
/ 19 марта 2019

Предположим, что я создал пользовательский плагин Gradle, который доступен по адресу https://repo.example.com/xyz и применяется следующим образом:

// build.gradle.kts

buildscript {
    repositories {
        jcenter()
        maven("https://repo.example.com/xyz")
    }

    dependencies {
        classpath("com.example:xyz-gradle-plugin:1.2.3")
    }
}

apply(plugin = "com.example.xyz")

Теперь рассмотрим, что мне нужно, чтобы мой плагин зависел от сторонней библиотеки(org.something:abc:4.5.6), который доступен только из другого пользовательского репозитория Maven (скажем, https://repo.something.org/abc).Я генерирую pom.xml моего плагина соответственно:

  <dependencies>
    <dependency>
      <groupId>org.something</groupId>
      <artifactId>abc</artifactId>
      <version>4.5.6</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <repositories>
    <repository>
      <id>xyz</id>
      <url>https://repo.example.com/xyz/</url>
    </repository>
    <repository>
      <id>abc</id>
      <url>https://repo.something.org/abc/</url>
    </repository>
  </repositories>

Теперь, когда я перестраиваю и повторно публикую плагин, клиентский код, который его использует, не может быть собран, потому что библиотека org.something:abc:4.5.6Плагин зависит от не может быть найден.По-видимому, pom.xml плагина получает неверную интерпретацию: информация о зависимостях извлекается из него, а раздел <repositories/> игнорируется.

Единственный обходной путь - явное добавление maven("https://repo.something.org/abc") к разделу buildscriptкаждого проекта, использующего мой плагин, к которому я бы не стал принуждать своих пользователей.

Существуют ли альтернативные решения?

Обновление: об этом сообщалось Gradle команда как номер # 8811 .

1 Ответ

0 голосов
/ 21 марта 2019

Цитирование ответа Gradle команды:

На самом деле есть веские причины для поведения Gradle:

  • Gradle придает большое значение источнику зависимости. Для Gradle org:foo:1.0 от Maven Central и org:foo:1.0 от JCenter считаются разными вещами. Вот почему порядок репозитория и фильтрация имеют значение.

  • Перехват хранилища был продемонстрирован как вектор атаки , поэтому наличие системы, которая эффективно, транзитивно и прозрачно позволяет загружать зависимости из любого хранилища, небезопасно.

По этим причинам это изменение вряд ли произойдет.

Однако есть варианты для вашего плагина:

  • Тень Эта экзотическая зависимость в ваш собственный плагин

  • Мотивируйте владельца этой библиотеки опубликовать ее в хорошо известном репозитории или в репозитории вашего плагина

  • Настройте репозиторий вашего плагина так, чтобы он также отражал этот другой репозиторий

...