Gradle - выполнять задачу, только если код в каталоге изменился - PullRequest
2 голосов
/ 19 июня 2019

У меня есть задача Gradle, которая создает JAR на 100 МБ. Теперь я хочу, чтобы он создавался как часть моего gradle build только в том случае, если изменился код в проекте (скажем, в конкретном каталоге ./src).

Итак, на данный момент build.gradle.kts выглядит так:

tasks {
    "shadowJar"(ShadowJar::class) {
        isZip64 = true
        archiveFileName.set("${project.name}.jar")
        dependencies {
            include(dependency(".*:.*:.*"))
            exclude(dependency("org.apache.spark:.*"))
        }
    }
}

tasks {
    "build" {
        dependsOn("shadowJar")
    }
}

Есть идеи, как мне этого добиться?

Спасибо

p.s. И в качестве фона я делаю, чтобы улучшить время сборки. Я уже нашел 2 вещи для моего gradle.properties:

org.gradle.parallel=true
org.gradle.caching=true

1 Ответ

2 голосов
/ 19 июня 2019

В общем, если вы хотите сообщить задаче, как узнать, актуальна она или нет, вам нужно определить inputs и outputs.Это то, что говорит Gradle, является ли задача актуальной или нет.Если ничего не изменилось во входах или выходах с момента последнего запуска задачи, Gradle знает, что она обновлена, и не будет повторно выполнять задачу.

В вашем случае входные данные будут исходной папкой,и на выходе будет баночка.Это объясняется в документации Gradle здесь .Вы можете увидеть пример в этой статье, которая показывает, как Gradle может вызывать Webpack, но только если что-то изменилось.

Таким образом, вы можете сделать что-то вроде этого:

tasks {
    "shadowJar"(ShadowJar::class) {
        // all the stuff you already have, plus these two new lines:
        inputs.dir("... the source dir ...")
        outputs.file("... the generated jar ...")
    }
}

Однако я предполагаю, что задача shadowTask, которую вы используете, отсюда: https://github.com/johnrengelman/shadow?Если это так, вам, возможно, на самом деле не нужно устанавливать inputs и outputs напрямую, так как задача уже сама их устанавливает.Например, если вы посмотрите на исходный код этого плагина, вы увидите, что он помечает один метод с помощью @InputFiles (см. здесь ).Это, согласно документам:

Помечает свойство как указание входных файлов для задачи.

Выходные данные также указываются в одном из суперклассов (AbstractArchiveTask.getArchiveFile).

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