Задача Gradle не выполняется как требуется (перед компиляцией) - PullRequest
0 голосов
/ 23 марта 2019

Введение

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

Вот задание Gradle, которое у меня сейчас есть:

def generatedDir = "$buildDir/generated"

// noinspection GroovyAssignabilityCheck
task generateBuildInfo {
    inputs.property "version", rootProject.version.toString()
    inputs.property "name", rootProject.name.toString()

    outputs.dir generatedDir
    outputs.upToDateWhen { false }

    doFirst {
        def buildInfoFile = file("$generatedDir/BuildInfo.kt")
        buildInfoFile.parentFile.mkdirs()
        buildInfoFile.text = """
        internal data class BuildInfo(
          val version: String = "${project.version.toString() ?: "unspecified"}",
          val name: String = "${project.name.toString() ?: "unspecified"}"
        )
        """.replace("        ", "").trim()
    }
}

Чтобы решить эту проблему с помощью IntelliJ IDEA, я добавил свою новую папку в исходные коды проекта и, очевидно, связал зависимости следующим образом:

sourceSets.main.kotlin.srcDirs += generatedDir

project.afterEvaluate {
    compileJava.dependsOn generateBuildInfo
    compileKotlin.dependsOn generateBuildInfo
}

Все это делается в отдельном файле (чтобы не загрязнять мои основные скрипты). Из-за этой организации после применения плагинов я просто включаю генератор в свой основной скрипт, например:

apply from: "gradle/scripts/build-info-generator.gradle"

ПРОБЛЕМА

Похоже, код генератора выполняется только один раз, после запуска assemble, когда я впервые запустил clean на этом модуле. Это не то, что я хочу, потому что когда я изменяю некоторые свойства проекта (например, version), источник не обновляется ... как если бы compileJava / compileKotlin и моя пользовательская задача не выполнялась.

Они не отображаются в журналах сборки как выполненные.

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

1 Ответ

2 голосов
/ 23 марта 2019

IDEA имеет собственную систему сборки, независимую от Gradle.

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

Вы также можете настроить его так, чтобы делегировать все задачи сборки / запуска Gradle.Но это не по умолчанию.

...