Gradle пользовательское задание указать входные данные - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю плагин для наших методов выпуска.Одна из задач, которые мне нужны, должна собрать выходные данные distZip каждого подпроекта, от которых зависит эта задача, и упаковать их в один zip-файл с некоторыми статическими файлами.

Вот мой плагин (все остальные задачи и расширения для простоты удалены):

open class SemanticVersionPlugin : Plugin<Project> {

    override fun apply(project: Project) {
        project.tasks.create("release", ReleaseTask::class.java) {
            group = "releasing"
        }
    }
}

Вот моя задача:

open class ReleaseTask : Zip() {

    // This fuction copies the content of the distZip output into this task    
    private fun addProjectResultToRelease(zip: Zip, projectPath: String) {
        logger.quiet("   Adding $projectPath")
        with(zip) {
            val distTaskName = "$projectPath:distZip"
            val task = project.tasks.findByPath(distTaskName) ?: throw GradleException("Task not found: $distTaskName")
            task.outputs.files.filter { it.extension == "zip" }.forEach {
                val srcZip = project.zipTree(it)
                //includeEmptyDirs = false
                from(srcZip) {
                    eachFile {
                        this.path = (this.path.replaceBefore(delimiter = "/", replacement = ""))
                    }
                }
            }
        }
    }

    // Some default value overrides
    init {
        outputs.upToDateWhen { false }
        destinationDir = File("_release")
        baseName = project.name
    }


    @Suppress("unused")
    @TaskAction
    fun action() {
        val ext = project.extensions["semanticVersion"] as SemanticVersionExtension

        println(dependsOn.joinToString { it.toString() })

        // Iterating through dependencies
        dependsOn.forEach {
            it as String
            println("DEP: $it")
            addProjectResultToRelease(this, it.substringBeforeLast(":"))
        }

        from(project.file("version.txt"))

        super.copy()
    }
}

В сценарии сборки, где я его использую:

tasks.withType<ReleaseTask> {
    dependsOn(":core:distZip")
}

Первый вопрос: это initзаблокировать правильное место для установки или переопределения значений по умолчанию?

Когда я запускаю эту задачу, я получаю сообщение «NO-SOURCE»:

> ...
> Task :core:distZip UP-TO-DATE
> Task :release NO-SOURCE

Как я могу указать, что выходысоответствующие distZips являются входами этой задачи?

1 Ответ

0 голосов
/ 19 апреля 2019

После нескольких десятков разных подходов я нашел решение. Я не был далек от правильной реализации с переопределением функции dependsOn.

Прежде всего, я перешел на версию 5.4. Это делало некоторые свойства ZipTask устаревшими, но в остальном обновление было простым.

open class ReleaseTask : Zip() {

    // This function zips out the zip files and removes the root directory    
    private fun addProjectResultToRelease(task: Task) {
        logger.quiet("   Adding ${task.path}")
        task.outputs.files.apply { println(this) }.filter { it.extension == "zip" }.forEach {
            val srcZip = project.zipTree(it)
            includeEmptyDirs = false
            from(srcZip) {
                eachFile {
                    this.path = (this.path.replaceBefore(delimiter = "/", replacement = ""))
                }
            }
        }
    }

    // This overrides calls the unzip function for each dependancy
    override fun dependsOn(vararg paths: Any?): Task {
        super.dependsOn(*paths)

        paths.forEach {
            val t = project.tasks.getByPath(it.toString())
            addProjectResultToRelease(t)
        }

        return this
    }

    // Some refactor was needed for upgrade
    init {
        println("Init")
        outputs.upToDateWhen { false }
        from(project.file("version.txt"))
        destinationDirectory.set(project.file("_release"))
        archiveBaseName.set(project.name)
    }

    // At the moment this function override is needless, but here will come some other 
    // activities later
    override fun copy() {
        val ext = project.extensions["semanticVersion"] as SemanticVersionExtension

        println(archiveFile.get())

        super.copy()
    }
}

Я все еще не полностью доволен настройками в блоке init. Вместо этого может быть функция жизненного цикла, которую можно переопределить, но я пропустил ее.

...