Как преобразовать централизованный массив зависимостей в groovy в kotlin? - PullRequest
0 голосов
/ 08 мая 2019

В скрипте groovy я мог бы назначить список зависимостей в массиве как «реализацию library.frameworkLibs», существует ли подобный подход в kotlin?

Цель состоит в том, чтобы иметь список зависимостей в массиве,так что каждый список может быть индивидуально назначен в подпроектах.

plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

sourceCompatibility = '1.8'

/* 1. centerilize dependencies for all projects */
ext.libraries = [
    frameworkLibs: [
        'org.springframework.boot:spring-boot-starter-data-redis',
        'org.springframework.boot:spring-boot-starter-web',
        'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1',
        'org.springframework.kafka:spring-kafka'
    ],
    testLibs: [
        'org.springframework.boot:spring-boot-starter-test',
        'org.springframework.kafka:spring-kafka-test'
    ],
    sqlLibs: [
        'org.postgresql:postgresql'
    ]
]

allprojects {
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'

    repositories {
        mavenCentral()
    }

    dependencies {
        /* 2. establish dependencies */
        implementation libraries.frameworkLibs
        runtimeOnly libraries.sqlLibs
        testImplementation libraries.testLibs
    }
}

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Вы можете изменить свою карту зависимостей на:

val libraries by extra {
    mapOf(
            "frameworkLibs" to listOf(
                    "org.springframework.boot:spring-boot-starter-data-redis",
                    "org.springframework.boot:spring-boot-starter-web",
                    "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1",
                    "org.springframework.kafka:spring-kafka"
            )
    )
}

И тогда в вашем блоке зависимостей это должно быть:

    libraries["frameworkLibs"]?.forEach { s -> implementation(s) }

Вы можете добавить метод расширения в Project как часть сценария buildSrc, чтобы скрыть это forEach, чтобы заставить работать зависимости ...

1 голос
/ 08 мая 2019

Вы можете создать переменную для хранения зависимостей, затем в блоке allprojects или subprojects вы можете обратиться к этому массиву. Например, вы можете определить класс, в котором хранятся ваши различные типы зависимостей (например, каждая в виде массива строк), создать экземпляр этого класса и заполнить его, сохранить ссылку на него в переменной, а затем использовать значение этой переменной для назначьте зависимости, как показано ниже:

class Libraries(val frameworkLibs: Array<String>, val testLibs: Array<String>, val sqlLibs: Array<String>)

val libraries = Libraries(
    arrayOf(
        "org.springframework.boot:spring-boot-starter-data-redis",
        "org.springframework.boot:spring-boot-starter-web",
        "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1",
        "org.springframework.kafka:spring-kafka"
    ),
    arrayOf(
        "org.springframework.boot:spring-boot-starter-test",
        "org.springframework.kafka:spring-kafka-test"
    ),
    arrayOf("org.postgresql:postgresql")
)

allprojects {
    dependencies {
        libraries.frameworkLibs.forEach { implementation(it) }
        libraries.sqlLibs.forEach { runtimeOnly(it) }
        libraries.testLibs.forEach { testImplementation(it) }

Я не могу найти способ передать массив зависимостей в такие методы, как implementation или runtimeOnly, поэтому вместо этого я зацикливаю их и добавляю каждую зависимость по отдельности. Если есть способ передать массив в одну строку, надеюсь, кто-то другой скажет нам, как это сделать.

0 голосов
/ 08 мая 2019

Спасибо, Тимійятс и Йони Гиббс. Следующая реализация решила мою проблему.

plugins {
    id("org.springframework.boot") version "2.1.4.RELEASE"
    java

    // this plugin is required for Kotlin
    id("io.spring.dependency-management") version "1.0.7.RELEASE"
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

repositories {
    jcenter()
}

val libraries by extra {
    mapOf(
        "frameworkLibs" to listOf(
            "org.springframework.boot:spring-boot-starter-data-redis",
            "org.springframework.boot:spring-boot-starter-web",
            "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1",
            "org.springframework.kafka:spring-kafka"
        ),
        "testLibs" to listOf(
            "org.springframework.boot:spring-boot-starter-test",
            "org.springframework.kafka:spring-kafka-test"
        ),
        "sqlLibs" to listOf(
            "org.postgresql:postgresql"
        ),
        "testLibs" to listOf(
            "org.springframework.boot:spring-boot-starter-test",
            "org.springframework.kafka:spring-kafka-test"
        )
    )
}

allprojects {
    group = "com.example"
    version = "0.0.1-SNAPSHOT"

    dependencies {
        libraries["frameworkLibs"]?.forEach { s -> implementation(s) }
        libraries["testLibs"]?.forEach { s -> implementation(s) }
        libraries["sqlLibs"]?.forEach { s -> runtimeOnly(s) }
        libraries["testLibs"]?.forEach { s -> testImplementation(s) }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...