Пользовательские метаданные в дескрипторе зависимости Gradle

Вот как я добавил зависимости в моем build.gradle

 // Dependency Versioning
    apply plugin: 'io.spring.dependency-management'
    dependencyManagement {
        imports {
            mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Edgware.RELEASE'
            mavenBom 'io.pivotal.spring.cloud:spring-cloud-services-dependencies:1.5.0.RELEASE'
            mavenBom 'org.springframework.boot:spring-boot-dependencies:1.5.15.RELEASE'

        }
        dependencies {

            dependency 'io.springfox:springfox-swagger2:2.8.0'
            dependency 'io.springfox:springfox-swagger-ui:2.8.0'

            dependency 'org.flywaydb:flyway-core:4.2.0'
            dependency 'com.microsoft.sqlserver:mssql-jdbc:6.2.2.jre8'
        }
    }

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

Скажите, одобрила ли моя архитектурная команда io.springfox:springfox-swagger2:2.8.0 зависимость и если номер утверждения APPL-1054 тогда я должен добавить этот номер также как metadata вместе с тегом зависимости, с которым у меня будет другая задача gradle, чтобы потреблять эти числа

что-то похожее dependency 'io.springfox:springfox-swagger2:2.8.0' : APPL-1054

Пожалуйста, помогите с вашими идеями

1 ответ

Решение

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

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        gradleApi()
    }
}

group 'com.stackru'
version '1.0-SNAPSHOT'

repositories {
    jcenter()
}

configurations {
    audited.extendsFrom(compile)
}

Map<String, Object> approvedDeps = [
        'junit:junit:4.12': 'APPROVAL-1234'
]

dependencies {
    compile gradleApi()
    audited 'junit:junit:4.12'
    audited 'org.mockito:mockito-android:2.22.0'
}
dependencies {
    components {
        all { ComponentMetadataDetails details ->
            String requestedArtifact = "${details.id.group}:${details.id.name}:${details.id.version}"
            String approvalCode = approvedDeps[requestedArtifact]
            if (approvalCode == null) {
                throw new GradleException("Use of unapproved dependency (${requestedArtifact})")
            }
            logger.lifecycle("Requested dependency (${requestedArtifact}) is approved: ${approvalCode}")
            return details
        }
    }
}

// lets fake some action that would trigger dependency resolution
configurations.eachWithIndex { Configuration entry, int index ->
    if (entry.canBeResolved) {
        entry.resolve()
        print("Resolved index: ${index}")
    }

}

Теперь, если мы бежим ./gradlew clean build мы получаем ошибку, поскольку добавлена ​​неутвержденная зависимость.

$ ./gradlew clean build

> Configure project :
Requested dependency (junit:junit:4.12) is approved: APPROVAL-1234

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/jonstanford/dev/stackru/q52427676/build.gradle' line: 36

* What went wrong:
A problem occurred evaluating root project 'q52427676'.
> Could not resolve all dependencies for configuration ':audited'.
   > There was an error while evaluating a component metadata rule for org.mockito:mockito-android:2.22.0.
      > Use of unapproved dependency (org.mockito:mockito-android:2.22.0)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 0s

Конечно, вы можете перенести эту функциональность в пользовательский плагин или что-то подобное, но я думаю, что основная идея верна.

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