Как заставить gradle обновлять / перезагружать каталог (lib)? - PullRequest
1 голос
/ 31 марта 2020

В моем проекте gradle у меня есть каталог libs, который содержит один файл jar. Я создал задачи gradle, одна загружает из jenkins новую версию jar и сохраняет в build direcotry, удаляет старый jar. Затем у меня есть две задачи для копирования и обновления файла свойств:

Копировать:

task copyJar(type: Sync) {
    from 'build'
    into 'libs'
    include '*.jar'
}

Обновление:

task('updateJar') {
    fileTree("libs").
    def files =  fileTree("libs").filter { it.isFile() }.files.name
    if(!files.size() ==1) {
        throw new GradleException('Error occured - In the libs folder, should be only one JAR file!')
    }
    def newJarFileName = files.first()
    def newSDKVersion = newJarFileName.substring(0,newJarFileName.lastIndexOf('.'))
    println newSDKVersion

    def versionPropsFile = file('version.properties')
    Properties versionProps = new Properties()
    versionProps.load(new FileInputStream(versionPropsFile))

    versionProps['VERSION_SDK'] = newSDKVersion
    versionProps.store(versionPropsFile.newWriter(), null)
}

и обе задачи работают, но updateJar по-прежнему видит, что старый файл фляги Любая возможность перезагрузить / обновить sh, что содержит libs direcotry? Как заставить gradle сделать это, любое задание по умолчанию?

1 Ответ

2 голосов
/ 31 марта 2020

Вам необходимо зарегистрировать каталог libs как ввод задачи для задачи updateJar. Это позволяет gradle знать, что выходные данные задачи updateJar зависят от содержимого каталога libs (это автоматически выполняется в случае задачи copyAar, потому что она обращается к своим входам декларативно. Задача updateJar имеет программный характер c, поэтому gradle может не понять это автоматически).

Добавление следующего в определение задачи updateJar поможет:

inputs.dir('libs')

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

Обратите внимание, что в приведенном выше примере c есть еще одна проблема: задача updateJar выполняет работу во время конфигурации, а не при ее выполнении. время. Это имеет ряд негативных последствий, таких как добавочное кэширование работы невозможно, задача updateJar выполняет работу, даже если она не выполняется.

Это можно исправить, обернув часть, которая работает в блок doFirst {} .

Соберите все это вместе, и определение задачи будет выглядеть так:

task('updateJar') {
  doFirst {
    def files =  fileTree("libs").filter { it.isFile() }.files.name
    if(!files.size() ==1) {
      throw new GradleException('Error occured - In the libs folder, should be only one JAR file!')
    }
    def newJarFileName = files.first()
    def newSDKVersion = newJarFileName.substring(0,newJarFileName.lastIndexOf('.'))
    println newSDKVersion

    def versionPropsFile = file('version.properties')
    Properties versionProps = new Properties()
    versionProps.load(new FileInputStream(versionPropsFile))

    versionProps['VERSION_SDK'] = newSDKVersion
    versionProps.store(versionPropsFile.newWriter(), null)
  }
  inputs.dir('libs')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...