Gradle uploadArchives пространство имен артефактов при зависимости от плагина

У меня есть приложение для Android с Gradle. Я использую плагин gradle-release для создания автоматических выпусков, а затем задачу uploadArchives из Gradle для загрузки сгенерированного.apk в репозиторий Maven (Nexus).

Я должен добавить архивы для динамической загрузки во время выполнения, потому что моя сборка использует пользовательские версии Android. Все работает нормально, когда я запускаю uploadArchives из командной строки:

variant.outputs.each { output ->
    def apkFile = output.outputFile

    tasks."assemble${capitalizedVariantName}" << {
        artifacts.archives [file: apkFile, classifier: variant.baseName]
    }
}

uploadArchives {
    repositories {
        mavenDeployer {
            pom.groupId = PROJECT_GROUP
            pom.artifactId = PROJECT_NAME
        }
    }
}

Тогда я бегу:

./gradlew assembleFlavorNameRelease uploadArchives

И.apk правильно загружен в Nexus.

Мне нужно запустить задачу uploadArchives ДО того, как плагин релиза автоматически изменит название версии проекта и зафиксирует. В принципе:

- current version: 0.1.0-SNAPSHOT
- run release
- version becomes: 0.1.0
- build (build task)
- upload this build to Nexus (uploadArchives task)
- update the version to: 0.1.1-SNAPSHOT (updateVersion task)

Чтобы добиться этого, у меня есть задача updateVersion плагина gradle-release в зависимости от uploadArchives.

updateVersion.dependsOn uploadArchives

Хорошо, когда я делаю это, artifacts.archives. пусто, поэтому нет загрузки.

Я подозреваю, что, возможно, поскольку я добавляю задачу uploadArchives в качестве зависимости задачи плагина релиза, "пространство имен" отличается, поэтому в основном задача uploadArchives не использует "тот же экземпляр" artifacts.archives, заполненный во время сборка.

1 ответ

Решение

updateVersion.dependsOn uploadArchives

Если вы сделаете это, то вы в конечном итоге uploadArchives в том же процессе, что и выпуск, но не в том же процессе, что и сборка. Чтобы получить правильную версию для самой задачи сборки, плагин выпуска запускает новую сборку Gradle, которая запускает сборку с правильным номером версии. (Это сделано потому, что многие другие плагины, такие как maven-publish, не могут использовать измененную версию проекта во время выполнения)

Если вы хотите выполнять задачи в том же процессе, что и сборка, вам нужно либо использовать задачи beforeReleaseBuild или же afterReleaseBuild зависит от. Оба они запускаются в одном и том же процессе.

Так что в вашем случае это будет

afterReleaseBuild.dependsOn uploadArchives

Это запускает uploadArchives непосредственно после завершения сборки с версией выпуска.

Для лучшего понимания я адаптировал вашу задачу:

- current version: 0.1.0-SNAPSHOT
- run release
- version becomes: 0.1.0 (and is written to gradle.properties)
- spawn new gradle build
    - build (build task)
    - upload this build to Nexus (uploadArchives task)
- update the version to: 0.1.1-SNAPSHOT (updateVersion task)
Другие вопросы по тегам