【问题标题】:Gradle .execute method showing error after gradle updateGradle .execute 方法在 gradle 更新后显示错误
【发布时间】:2019-05-30 09:30:48
【问题描述】:

我的项目在更新到版本 3.4.1 后,使用 gradle 插件版本 3.0.1 运行完美我正在经历同步失败。

以前我使用包装器4.10.1,现在更新为5.1.1

afterEvaluate(new Action<Project>() {

@Override
void execute(Project project) {
    tasks.getByName("assembleRelease").doLast {
        tasks.copyReleaseBuild.execute() //error is here
        tasks.copyReleaseBuildToXX.execute()
        tasks.copyReleaseBuildToXXXX.execute()
    }
}

copyReleaseBuild 任务的写法如下...

task copyReleaseBuild(type: Copy) {
    def releaseDir = getProjectProperty('releaseDir')
    if (releaseDir?.trim()) {
    //if release folder is provided
    def releaseAarFile =
            getProjectProperty('sourceCodeDir') + "/android-corekit/kit/build/outputs/aar/kit-release.aar"
    from releaseAarFile
    into releaseDir
    }

task copyReleaseBuildToXX(type: Copy) {
        from "./build/outputs/aar/kit-release.aar"
        into "../kitwrapper/libs"
    }

task copyReleaseBuildToXXXX(type: Copy) {
        from "./build/outputs/aar/kit-release.aar"
        into "../kitwrapperapp/libs"
    }
}

从过去两天开始,我一直在尝试解决,但由于我缺乏 groovy 知识,所以没有任何效果。

请检查我在构建项目时收到的错误日志...

【问题讨论】:

    标签: android gradle groovy build.gradle


    【解决方案1】:

    这是因为您使用的是更新版本的 gradle(查看migration to gradle v5

    TaskInternal 的以下属性和方法已被删除 - 使用任务依赖项、任务规则、可重用实用程序方法或 Worker API 代替直接执行任务。

    • 执行()
    • 执行者
    • getValidators()
    • addValidator()

    现在你不能直接调用execute方法,但你必须使用任务依赖来获得相同的结果。

    只需在您的build.gradle 中定义:

    task copyReleaseBuild {
        dependsOn 'assembleRelease'
        //...
    }
    

    并删除它:

    afterEvaluate(new Action<Project>() {
    
    @Override
    void execute(Project project) {
        tasks.getByName("assembleRelease").doLast {
            tasks.copyReleaseBuild.execute() //error is here
        }
    }
    

    【讨论】:

    • 在这种情况下,您必须以相同的逻辑修改所有方法。
    【解决方案2】:

    Upgrading your build from Gradle 4.x to 5.0

    TaskInternal 的以下属性和方法已被删除 - 使用任务依赖项、任务规则、可重用实用程序方法或 Worker API 代替直接执行任务。

    • 执行()
    • 执行者
    • getValidators()
    • addValidator()

    在您的情况下,您似乎在任务之间存在依赖关系:copyReleaseBuild 必须在 assembleRelease 之后运行

    所以,这个简单的build.gradle 代表了这种依赖关系:

    task copyReleaseBuild {
        dependsOn 'assembleRelease'
        doLast {
            println 'run copyReleaseBuild'
        }
    }
    task assembleRelease {
        doLast {
            println 'run assembleRelease'
        }
    }
    

    和命令gradle copyReleaseBuild 运行两个任务:

    # gradle copyReleaseBuild
    
    > Task :assembleRelease
    run assembleRelease
    
    > Task :copyReleaseBuild
    run copyReleaseBuild
    
    BUILD SUCCESSFUL in 2s
    2 actionable tasks: 2 executed
    

    【讨论】:

    • 您能否就我的问题分享一下示例,因为我已经阅读了此文档,但没有什么能完全解决我的问题。
    • 添加了一个简单的例子
    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2019-07-07
    • 2013-06-12
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多