Переопределить эксклюзивный контент для репозитория, определенного в скрипте init.gradle

Существует сценарий инициализации $GRADLE_USER_HOME/init.d/init.gradle, который имеет эксклюзивный контент, определенный для некоторого репозитория и фильтруемый по группе:

allprojects {
    repositories {
        exclusiveContent {
          forRepository {
               maven {
                  url 'https://the-first-nexus/nexus/content/repositories/deploy-it-all/'
               }
          }
          filter {
             includeGroup 'com.company.group'
          }
        }
}
         

Этот исходный сценарий используется всей командой, а также применяется для заданий CI/CD.

Мне нужно определить отдельный эксклюзивный контент для некоторых конкретных артефактов из одной группы com.company.group в одном из моих проектов, чтобы они поступали из разных репозиториев.

Я попытался добиться этого, добавив в проект build.gradle следующий раздел с более узким фильтром:

  repositories {
      exclusiveContent {
          forRepository {
               maven {
                  url 'https://the-second-nexus/nexus/content/repositories/public/'
               }
          }
          filter {
             includeVersion 'com.company.group', 'artifact-special', '1.0.0'
          }
       }
   }

К сожалению, это не работает — правило, определенное в скрипте инициализации, имеет приоритет над настройками проекта. Изменение сценария инициализации для меня не вариант, я могу изменить только проект build.gradle. Градле версия 7.4.2

Кто-нибудь знает, есть ли решение подобных проблем и можно ли переопределить эксклюзивный контент для репозитория, настроенного в init.gradle?

Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

тупик Gradle

Ух ты, ты нашел там что-то вроде тупика Gradle.

Это выглядит как:

  • Gradle не предоставляет интерфейса для настройки существующих правил include для репозитория.
  • Любое правило include, соответствующее вашему целевому артефакту, будет жадно удерживать его (как вы заметили).

Я бы предложил поднять этот вопрос с командой Gradle, но, похоже, у них нет планов менять API на данный момент.

Обходные пути

Я вижу три возможных решения для правильной работы вашей конфигурации, ни одно из которых не является полностью удовлетворительным:

  1. Не используйте сценарий инициализации вашей компании и правильно добавляйте репозиторий с первого раза.
  2. Удалите проблемный репозиторий и добавьте его заново с правильными include правилами.
  3. Настройте параметры существующего репозитория, получив доступ к частному полю1 с помощью магии Groovy.

Настройка с помощью магии Groovy

Я проиллюстрирую это, поскольку оно, вероятно, наиболее близко к тому, на что вы надеялись.

repositories {
    named("maven") {
        content {
            /*
             * ***Unstable usage***
             * Accessing a private field of
             * org.gradle.api.internal.artifacts.repositories.DefaultRepositoryContentDescriptor
             */
            includeSpecs.clear() 
            includeModuleByRegex(groupRegex, moduleRegex) // Come up with suitable regex
        }
    }
}

Здесь вы получаете доступ к хранилищу по имени. Похоже, ваш сценарий инициализации не дал репозиторию имя, но первый зарегистрированный безымянный репозиторий Maven будет называться maven, затем maven2 и т. д.

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


1 Мы хотим изменить includeSpecs в DefaultRepositoryContentDescriptor

Другие вопросы по теме