为什么提取此方法不适用于gradle?

时间:2015-03-08 07:02:53

标签: groovy gradle refactoring extract-method

我有一个多模块项目的gradle构建脚本。

为了更好的可读性,我想提取一些方法,但是当我这样做时,脚本失败并出现异常:

Cannot add task ':signArchives' as a task with that name already exists.

完全可重复的示例: 有一个空的目录,里面有两个文件:

settings.gradle

include 'eins', 'zwei'

的build.gradle

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

allprojects {
    apply plugin: 'signing'
}

subprojects {
    signing {
        sign configurations.archives
    }
}

private Object signIt() {
    signing {
        sign configurations.archives
    }
}

在该目录中执行以下命令:

gradle wrapper

gradlew tasks

您将获得一份可用任务列表。

将build.gradle文件更改为以下

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

allprojects {
    apply plugin: 'signing'
}

subprojects {
    signIt()
}

private Object signIt() {
    signing {
        sign configurations.archives
    }
}

再次执行:

gradlew tasks

现在你(或者至少我)得到:

> Cannot add task ':signArchives' as a task with that name already exists.

1 个答案:

答案 0 :(得分:2)

子项目上下文在重构中丢失了。

如果在签名闭包中添加println project.name,您可以看到在第一个变体中对每个子项目进行一次签名,而在第二个变体中对根项目进行了两次签名。

您可以通过将子项目作为参数传递给签名方法来修复它:

subprojects {
    signIt(project)
}

private Object signIt(project) {
    project.with {
        signing {
            sign configurations.archives
        }
    }
}