【问题标题】:Gradle task order for creating dynamic Global List for a Copy task exclude用于为复制任务排除创建动态全局列表的 Gradle 任务顺序
【发布时间】:2016-07-20 21:56:31
【问题描述】:

好的,我仍然有一个问题,非常感谢有人能阐明我显然缺少的东西。 我以为我理解了我想要完成的 Gradle 任务,但我似乎无法让最后一点工作。

这是我想要做的,按编号顺序:

  1. 创建一个动态的全局“copyExcludes”列表;在一项任务中
  2. 复制整个目录树,不包括“copyExcludes”列表;在另一个任务中
  3. 从 Copy 任务对文件树中的每个目录运行 maven 命令“mvn verify”
  4. 在所有 Maven 命令成功完成后,为目录树创建一个 ZIP 存档。

下面是代码,我一直在破解,无法获取“copyExcludes”列表,在“复制”任务执行之前更新,因此所有模块(子目录)都被复制,而不仅仅是少数几个我要。

/**
 * Copy all files to ${assemblyDir}, then run 'mvn verify' on each and every included module.
 * Then create an assembly ZIP
 */
def copyFromDir = rootProject.file('.')

def assemblyDir = "target/gradle_assembly"
def assemblyDestination = "target/assembly"
def assemblyName = "assembly.zip"

def List includedModules = []

//---------------------------------------------------------------------------//
def allModules = [
        'common',
        'spring-hello-world',
        'spring-configuration',
        'spring-advanced-configuration',
        'spring-jdbc',

        'spring-jms',
        'spring-batch',
        'spring-batch-configuration'
]

def copyExcludes = []

//---------------------------------------------------------------------------//

/**
 * Copy all files from root (./)
 but exclude the module sub directories that are from 'getCopyExcludes(allModules)'
 */
task copyFiles(type: Copy) {

    def cpExcludes = []

    ext {
        println "********** copyFiles ext{} **********"
        println "1 ********** (${copyExcludes.size()}) copyExcludes: '${copyExcludes}' **********"
        cpExcludes = copyExcludes
        cpExcludes = getCopyExcludes(allModules)
    }

    doFirst {
        println "********** copyFiles doFirst{} **********"
        println "2 ********** (${copyExcludes.size()}) copyExcludes: '${copyExcludes}' **********"
        cpExcludes = copyExcludes
        cpExcludes = getCopyExcludes(allModules)
        println "********** (${cpExcludes.size()}) cpExcludes: '${cpExcludes}' **********"

    }

//    doLast{

        if (file(buildDir).exists()) {
            delete "./target"
        }

        from("${copyFromDir}") {
            into '.'

            include '*'
            include '**/*' //to include contents of a folder present inside Reports directory
            include '**/*.*' //to include contents of a folder present inside Reports directory

            exclude (getCopyExcludes(allModules))

        }
        into {
            def outputDir = assemblyDir;
            outputDir
        }
//    }
}



//---------------------------------------------------------------------------//

//task mavenVerify() {
task mavenVerify(dependsOn:copyFiles) {

    println "\n\n********** mavenVerify **********\n"

    def moduleDir = "${assemblyDir}/code"

    doLast {

        // For each module that is to be included,
        allModules.each { module ->

        if (file("${assemblyDir}/code/${module}").exists()) {
            moduleDir = "${assemblyDir}/code/${module}"

            exec {
                args "-D${mavenRepo} -D${mavenOpt}"
                workingDir "${moduleDir}"

                def command = commandLine 'mvn', 'verify'
            }
            println "---------->  END ${moduleDir} ----------\n"
        }

        }
    }
    return "success"
}


//---------------------------------------------------------------------------//

/**
 * Create a ZIP file for the previoulsy validate code copied and verified.
 */
task assembleZip(type: Zip, dependsOn:mavenVerify){

    println "********** assembleZip **********"

    from "${assemblyDir}"
    include '*'
    include '**/*' //to include contents of a folder present inside Reports directory
    include '**/*.*' //to include contents of a folder present inside Reports directory
    archiveName "${assemblyName}"
    destinationDir(file("${assemblyDestination}"))

}
//---------------------------------------------------------------------------//


task basic_jdbc_aop_mvc_rest << {

    println "********** basic_jdbc_aop_mvc_rest **********"

    def modulesToKeep = []

//    doFirst{
    ext {
        // Create List
        modulesToKeep.addAll(modules_basic())
        modulesToKeep.addAll(modules_jdbc())

//        println "********** (${modulesToKeep.size}) modulesToKeep: '${modulesToKeep}' **********"

//        allModules.removeAll(modulesToKeep)
//         includedModules = allModules
//        println "********** (${includedModules.size()}) allModules (pre): '${includedModules/**/}' **********"
//        copyExcludes = getCopyExcludes(allModules)
//        println "********** (${copyExcludes.size()}) copyExcludes: '${copyExcludes}' **********"
    }

//    doFirst{
//        println "********** (${allModules.size()}) allModules (pre): '${allModules}' **********"
//        println "********** (${modulesToKeep.size}) modulesToKeep: '${modulesToKeep}' **********"

//        includedModules = allModules.minus(modulesToKeep)
        allModules.removeAll(modulesToKeep)
         includedModules = allModules
        println "********** (${includedModules.size()}) allModules (pre): '${includedModules/**/}' **********"
        copyExcludes = getCopyExcludes(allModules)
//        println "********** (${copyExcludes.size()}) copyExcludes: '${copyExcludes}' **********"
//    }

}


def List getCopyExcludes(mtr) {
    def newList = mtr.collect{ "**/${it}" }

    newList.addAll('**/target',
                    '**/.git',
                    '**/*.iml',
                    '**/.idea',
                    '**/gradle', // #5
                    '**/.gradle',
    )
//    newList.addAll(modulesToRemoveExclude(mtr))
    println "********** getCopyExcludes newList (${newList.size}): '${newList}' **********"
    return newList
}


[copyFiles]*.shouldRunAfter basic_jdbc_aop_mvc_rest


//---------------------------------------------------------------------------//
def modules_basic(){
    return [
            // Basic
            'common',
            'spring-hello-world',
            'spring-configuration',
            'spring-advanced-configuration'
    ]

}

def modules_jdbc(){
    return [
            // JDBC
            'spring-jdbc'
    ]

}


//--- THE END ---------------------------------------------------------------//

【问题讨论】:

    标签: java gradle groovy build.gradle


    【解决方案1】:

    我认为您可能对所有调试语句感到困惑。也许将其缩减到最低限度会帮助您更好地了解问题?

    例如,很难看到像“进入”这样的问题区域。在 from 子句和一个看起来很奇怪的“def List getCopyExcludes(mtr)”函数声明中。

    例如,这里有一个类似的更小的脚本,它可以执行您希望它执行的操作。

    def copyFromDir = "source/gradle_assembly"
    def assemblyDir = "target/gradle_assembly"
    
    task copyFiles(type: Copy) {
        from "${copyFromDir}" 
        into "${assemblyDir}"
        exclude getCopyExcludes()
    }
    
    def getCopyExcludes() {
        // exclude these 2 log files
        return ["tomcat.log", "cargo.log"]
    }
    

    也许从这里开始,您可以将其扩展为您当前的版本,方法是一次将每个任务添加回一个,同时验证它是否仍然有效?如果它破坏了某些东西,您就会知道是什么原因造成的。

    【讨论】:

    • 我可以从这个例子开始,但是你能告诉我如何从命令行获取输入,例如调用一个设置实际列表的任务,或者从命令行?
    • 您可以使用 -Pparam1=hello 将参数传递给 gradlew 任务。在 gradle 代码中,您可以通过 project.getProperty("param1") 访问它们。这回答了你的问题了吗? :)
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多