Gradle副本创建一个空文件

时间:2016-07-19 15:44:33

标签: file-io gradle

我有一个多项目gradle构建,它将一些源文件从父项目复制到构建目录中,然后尝试覆盖其中一个复制文件中的令牌。一切运行正常,但文件最终为空。这是包含要替换的模板的文件片段:

---
# file: clients.yaml
#properties shared by all client machines

jmeter_version: "${jmeterVersion}"

这里是gradle.properties的片段:

jmeterVersion=3.0

这里有两个假设要做的工作

/** This task copies files from pdo-shared */
task copyFromCommonProject(type:Copy, dependsOn: configurations.commonProjectContent){
    from configurations.commonProjectContent.collect{ zipTree(it) }
    into "$buildDir"
    /*doLast {
        updateAnsibleTokens.execute()
    }*/
}

task updateAnsibleTokens(type: Copy, dependsOn: copyFromCommonProject) {
   from "$buildDir/commons/ansible/group_vars/clients.yml"
   into "$buildDir/commons/ansible/group_vars/"
   expand(jmeterVersion: "$jmeterVersion")
}

我从父项目运行gradle clean :tpcds-benchmark:updateAnsibleTokens

第一个任务复制所有文件,并按预期复制第二个不起作用的任务

请注意doLast部分的评论。我尝试通过取消注释gradle clean :tpcds-benchmark:copyFromCommonProject部分并从第二个任务中删除doLast来将这两个任务作为dependsOn: copyFromCommonProject运行

在两个实例中,client.yml最终都是空的

P.S。即使我禁用expand(jmeterVersion: "$jmeterVersion")行,我也会收到一个空文件。通过一些更多的测试,似乎复制文件本身会生成一个空文件,所以也许我只是做错了。如果我只更改目标目录

,我的代码将会有效

2 个答案:

答案 0 :(得分:1)

基本上我必须reread this manual section更好地理解生命周期。

按照我原来的例子,这2个任务将按预期工作。我开始怀疑的问题是,在从源发生实际复制之前,在配置周期中发生了复制和修改client.yml的尝试。为第二个任务添加<<可确保在复制原始文件后的执行周期中进行修改

/** This task copies files from pdo-shared */
task copyFromCommonProject(type:Copy, dependsOn: configurations.commonProjectContent){
    from configurations.commonProjectContent.collect{ zipTree(it) }
    into "$buildDir"
}

task updateAnsibleTokens(type: Copy, dependsOn: copyFromCommonProject) << {
   from "$buildDir/commons/ansible/group_vars/clients.yml"
   into "$buildDir/commons/ansible/group_vars/"
   expand(jmeterVersion: "$jmeterVersion")
}

答案 1 :(得分:0)

我不确定,为什么添加<<有帮助。然而,在提取存档时进行扩展感觉更自然:

task copyFromCommonProject(type:Copy, dependsOn: configurations.commonProjectContent) {
    from configurations.commonProjectContent.collect {
         zipTree(it)
    }
    exclude "commons/ansible/group_vars/clients.yml"
    with copySpec {
         from configurations.commonProjectContent.collect {
              zipTree(it)
         }
         include "commons/ansible/group_vars/clients.yml"
         expand(jmeterVersion: "$jmeterVersion")
    }
    into "$buildDir"
}