Gradle: Как включить артефакты плюща по шаблону?

В Ivy я могу иметь зависимость, объявленную следующим образом:

<dependency org="org" name="module_name" rev="12" conf="conf_name->*">
  <include name="foo(.*)-bar" ext="zip" matcher="exactOrRegexp"/>
</dependency>

который загрузит все соответствующие файлы.

Как определить аналогичную (зависящую от regex) зависимость в Gradle?

Ответ 1

После нескольких пробных ошибок я смог расширить Gradle для разрешения зависимостей со следующим синтаксисом:

dependencies {
    compile "org:module_name:12" {
        artifact {
            name "foo.*-bar"
            type "zip"
        }
    }
}

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

Плюсы:

  • Правильно использует кеш артефактов Gradle.
  • Предотвращает передачу экспонатов (не соответствующих) артефактов.
  • Применяется механика разрешения зависимостей.

Ловушки, найденные во время реализации:

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

  • Соответствие разных объектов. После того, как дескриптор Ivy "разрешен" и загружен, несколько сложнее сопоставить его с нерешенной зависимостью (для обновления дескрипторов артефактов), поскольку разрешенный объект имеет другой тип. Пока что сопоставление координат "group-artifact-version" работает, но это хрупкое решение.

Образец кода для процессора зависимостей можно найти в GitHub (disclamer: предоставляется "как есть", никаких гарантов и обязанностей. Но если это удаляет вашу рабочую копию проекта, пожалуйста, дайте мне знать)

Ответ 2

Вы можете проверить документацию Gradle, связанную с Управление зависимостями → Определение настраиваемых шаблонов для репозитория Ivy

repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
        layout "pattern", {
            artifact "3rd-party-artifacts/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
            artifact "company-artifacts/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
            ivy "ivy-files/[organisation]/[module]/[revision]/ivy.xml"
        }
    }
}

Regex используется для фильтрации локальных файлов или для компиляции различных библиотек проектов:

compile fileTree (dir: "libs", includes: ['*.jar'])

Regex не разрешено в объявлении о вступлении.

По крайней мере, вы можете использовать переменные compile "foo:foo:$libVersion", но не регулярное выражение.

Кроме того, может оказаться полезным эта статья Java Build Tools: как работает управление зависимостями с Maven, Gradle и Ant + Ivy.