在解析依赖项后运行Zip任务

时间:2016-10-20 09:48:41

标签: java gradle

我有一个子项目B依赖于其他子项目A.我已经在" build.gradle"中包含了子项目A.子项目B。

dependencies {
    compile project(':projA')
}

我的子项目A和B都在发布时创建了一个捆绑式zip。我想将属于子项目A的一些文件复制到子项目B,而不再引用子项目A.根项目" build.gradle"脚本包含以下任务。

subprojects {
    task bundleBin(type: Zip) {
        description 'Creates "bin.zip" bundle.'

        dependsOn build

        def bundleName = "$outputName-bin"

        /// THIS DOES NOT WORK
        def deps = configurations.runtime.getAllDependencies().findAll { it instanceof ProjectDependency }
        println "GROOT: " + deps

        into("$bundleName/dep") {
            /// THE LINE BELOW WORKS
            /// I do not want a fixed reference since it is already defined in each subproject's "build.gradle" file
            //from project(':projA').file('conf/')
            for (dep in deps) {
                def proj = dep.getDependencyProject()
                from (proj.projectDir) {
                    include "conf/"
                    include "scripts/"
                }
            }
        }

        into(bundleName) {
            from(".") {
                include "conf/"
                include "scripts/"
            }
        }

        into("$bundleName/lib") {
            from configurations.runtime.allArtifacts.files
            from configurations.runtime
        }

        archiveName = "${bundleName}.zip"
    }
}

我不想再次引用子项目A的原因是因为我有一个依赖于其他项目的项目列表,我不想单独维护每个依赖项。

我希望上面的脚本要做的是,当B为'34运行" conf /"和"脚本/"在A和B中,将它们放入" B-bin.zip"。然而,如果我有一个子项目C依赖于A和B,上面的脚本将采用" conf /"和"脚本/"在A,B和C中,将它们放入" C-bin.zip"。

当我运行上面的脚本时,除非我将它封装在" doLast"中,否则不会出现依赖项。但是,这在Zip任务中不起作用。

我的问题是,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您需要确保首先解析配置。 您可以使用.resolvedConfiguration来做到这一点,但请注意,在配置时解析意味着无论调用什么任务都会执行此操作,应该避免。 This anwser建议您可以通过直接在配置上进行迭代来实现相同的目标。

只有在即将执行任务时,才可以使用gradle.taskGraph.whenReady来延迟解析配置。您仍然可以在那里配置任务。

答案 1 :(得分:0)

正如@Alpar所提到的,这是由于Zip任务在配置阶段处理依赖关系。为了解决这个问题,我遵循了answer

因此,我的捆绑代码现在看起来像:

task bundleBin << {
    task bundleBin_childTask(type: Zip) {
        def bundleName = "$outputName-bin"
        def deps = configurations.runtime.getAllDependencies().findAll { it instanceof ProjectDependency }

        into(bundleName) {
            for (dep in deps) {
                def proj = dep.getDependencyProject()
                from (proj.projectDir) {
                    include "conf/"
                    include "scripts/"
                }
            }
        }

        into(bundleName) {
            from(".") {
                include "conf/"
                include "scripts/"
            }
        }

        into("$bundleName/lib") {
            from configurations.runtime.allArtifacts.files
            from configurations.runtime
        }

        archiveName = "${bundleName}.zip"
    }

    bundleBin_childTask.execute()
}

此解决方案强制Zip任务在执行阶段解析其包含的文件。