Существует сценарий инициализации $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.
Это выглядит как:
include
для репозитория.include
, соответствующее вашему целевому артефакту, будет жадно удерживать его (как вы заметили).Я бы предложил поднять этот вопрос с командой Gradle, но, похоже, у них нет планов менять API на данный момент.
Я вижу три возможных решения для правильной работы вашей конфигурации, ни одно из которых не является полностью удовлетворительным:
include
правилами.Я проиллюстрирую это, поскольку оно, вероятно, наиболее близко к тому, на что вы надеялись.
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