groovy - Gradle任务对动态创建任务的依赖

标签 groovy gradle build.gradle gradle-plugin

我有一个多项目构建,需要在其中将一些依赖项发布到磁盘上的自定义本地Maven存储库,然后将此文件夹添加到分发zip中。

我使用maven-publish插件为每个子项目定义发布任务。

subprojects {
    apply plugin: 'maven-publish'

    configurations {
        offlineDependencies
    }

    publishing {
        publications {
            configurations.each { config ->
                if (config.name == "offlineDependencies") {
                    def files = config.files
                    config.dependencies.each { dep ->
                        files.each { file ->
                            if (file.name == "${dep.name}-${dep.version}.jar") {
                                "${dep.name}"(MavenPublication) {
                                    artifact (file) {
                                        groupId = "${dep.group}"
                                        artifactId = "${dep.name}"
                                        version = "${dep.version}"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        repositories {
            maven {
                name 'dependencies'
                url '../build/repository'
            }
        }
    }
}

使用分发插件创建一个zip文件
distributions {
    release {
        baseName 'release'
        contents {
            from('src/main/resources/')
            into("repository"){
                from("$buildDir/repository")
            }
        }
    }
}

在创建zip文件之前,如何确保所有动态创建的发布任务都已运行?

我尝试为所有子项目创建一个新任务,该任务依赖于动态创建的任务,但似乎当时尚未创建它们。
subprojects {
    task offlineDep << {
        println 'Creating offline dependencies'
    }
    offlineDep.dependsOn {
        tasks.findAll { task -> task.name.endsWith('PublicationToDependenciesRepository') }
    }
}

最佳答案

我找到了解决此问题的方法。通过收集 Artifact 的名称并生成任务名称,我知道稍后将创建它们并将它们添加为依赖项。

subprojects {
    apply plugin: 'maven-publish'
    def offlineDependencyNames = []

    publishing {
        publications {
            configurations.each { config ->
                if (config.name == "offlineDependencies") {
                    def files = config.files
                    config.dependencies.each { dep ->
                        files.each { file ->
                            if (file.name == "${dep.name}-${dep.version}.jar") {
                                offlineDependencyNames << dep.name
                                "${dep.name}"(MavenPublication) {
                                    artifact (file) {
                                        groupId = "${dep.group}"
                                        artifactId = "${dep.name}"
                                        version = "${dep.version}"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        repositories {
            maven {
                name 'dependencies'
                url "${rootProject.buildDir}/repository"
            }
        }
    }

    task publishOfflineDependencies
    publishOfflineDependencies.dependsOn {
        offlineDependencyNames.collect { name ->
"publish${name[0].toUpperCase()}${name.substring(1)}PublicationToDependenciesRepository"
        }
    }
}


releaseDistZip.dependsOn {
    subprojects.collect {
        p -> p.path + ':publishOfflineDependencies'
    }
}

关于groovy - Gradle任务对动态创建任务的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33997462/

相关文章:

groovy - 复制 groovy 中的列表列表

java - 如何替换字符串中的 N 个匹配项?

android - 使用 Robospice 和 Android Studio 的 Commons-Io Duplicate Entry 错误

android - 发布应用程序无法在Android 5和5.1中运行

dependencies - 2个gradle依赖有什么区别

java - 我可以在 Groovy 和/或 JRuby 中不受任何限制地使用 Hibernate ORM 框架吗?

java - 如何在 Java 或 Groovy 中为多种语言获取数字的序数后缀

groovy - 如何运行由 gradle 中的插件创建的任务

android - 如何在android list 中连接字符串资源和构建变量

java - Gradle 构建在 :compileJava: `No matching variant` 处失败