groovy - 为什么提取这个方法在gradle中不起作用?

标签 groovy gradle refactoring extract-method

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

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

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

完整的可重现示例: 有一个空目录,其中有两个文件:

设置.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.

最佳答案

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

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

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

subprojects {
    signIt(project)
}

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

关于groovy - 为什么提取这个方法在gradle中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28923962/

相关文章:

gradle - Gradle 如何解析 Gradle 插件门户中未列出的插件?

variables - Gradle:在范围内定义变量?

java - Hibernate:根据实体类自动创建/更新数据库表

Java StampedLock : what happens to writer while someone is reading

android - Gradle 没有将 Dagger 2 生成的类添加到 aar

java - 认知复杂性及其对代码的影响

groovy - 使用IntegrationSpec类时,nebula-test无法加载项目插件类

android - 编译失败-任务':app:mergeReleaseResources的执行失败-资源重复

c# - 如何重构这个巨大的 switch 语句?

c# - 如何促进 C# 变量的类型重构?