android - 具有依赖项的Android Studio自定义gradle任务- “Could not get unknown property”

标签 android android-studio gradle android-gradle-plugin

我正在使用一个提供gradle任务的库,以将内部版本上传到HockeyApp(https://github.com/x2on/gradle-hockeyapp-plugin)。我认为它具体做什么并不重要,只是它可以创建任务。我可以运行那些任务没有问题。我想创建一个任务来一次运行其中几个自定义任务。上载任务的名称类似于upload[BuildVariant]ToHockeyApp,它为每个构建变体创建了一个。我的自定义任务在项目级别gradle文件的android中定义,如下所示:

task uploadLegacyReleaseToHockeyApp(dependsOn:
            uploadVariant1ReleaseToHockeyApp,
            uploadVariant2ReleaseToHockeyApp,
            // etc
      ){}

同步gradle文件时,出现此错误:
Error:(89, 0) Could not get unknown property 'uploadVariant1ReleaseToHockeyApp' for object of type com.android.build.gradle.AppExtension.
我已经三重检查没有错别字,错误消息中的任务实际上存在。我是在做错什么,还是无法对像这样动态生成的任务编写依赖关系?我真的不知道该插件如何工作,但是它创建了自己的任务组,并在其中自动生成了任务。

根据lukegv的答案进行更新:

如果我使用dependsOn方法,则会出现此错误:Error:(90, 0) Could not get unknown property 'uploadVariant1ToHockeyApp' for task ':app:uploadLegacyReleaseToHockeyApp' of type org.gradle.api.DefaultTask.
使用构造函数:
task uploadLegacyReleaseToHockeyApp(dependsOn:
            'uploadVariant1ToHockeyApp',
            'uploadVariant2ToHockeyApp',
            // etc

我知道了:Could not find method uploadLegacyReleaseToHockeyApp() for arguments [{dependsOn=uploadVariant1ToHockeyApp}, uploadVariant2ToHockeyApp,...
请注意,第一项放在大括号中,其余的不在大括号中。

如果将所有任务名称放在一个字符串中,它将成功同步构建文件,但是该字符串将被解释为单个任务名称,因此运行失败。

最佳答案

Gradle区分配置阶段和执行阶段。在配置阶段,Gradle评估(通过执行)整个构建脚本,然后构建一个任务依赖树。在执行阶段,Gradle执行通过命令行指定的任务及其依赖项。

由于可以在整个构建脚本中添加或定义诸如变体之类的东西,因此生成的任务通常在配置阶段结束时创建,因此在配置期间它们无法作为 Project 范围中的属性使用。

但是,您可以通过将任务名称指定为String来定义任务依赖项。这样,将在构建依赖树时在配置阶段之后注册依赖项并使用随后生成的任务。

例如:

task t1 {
    dependsOn t2        // this fails
    dependsOn 't2'      // this works, even if t2 does not exist right now
}

afterEvaluate {
    task t2 {}
}

要解决您的特定问题,请将您的任务依赖性指定为包含任务名称的字符串:
task uploadLegacyReleaseToHockeyApp {
    dependsOn 'uploadVariant1ReleaseToHockeyApp'
    dependsOn 'uploadVariant2ReleaseToHockeyApp'
}

我在构造函数中使用了dependsOn方法而不是dependsOn映射键,因为我认为这种方式更为优雅,但是您也可以只编辑代码以使用字符串列表:
task uploadLegacyReleaseToHockeyApp(dependsOn: ['uploadVariant1ReleaseToHockeyApp', 'uploadVariant2ReleaseToHockeyApp']) {
    // configuration
}

关于android - 具有依赖项的Android Studio自定义gradle任务- “Could not get unknown property”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297457/

相关文章:

android - "fatal error: Eigen/Dense: No such file or directory"//特征库

android - 查找 “NdkCompile is no longer supported”的来源

php - 如何解决 org.json.JSONException 中的错误?

Android Studio 1.1.0 批量 "cannot resolve symbol"错误

gradle - gradle:避免在多个项目中执行相同的自定义任务

android - 手持 iPhone Android 特定 CSS 根本不起作用

Android Gallery(查看)视频(也是缩略图问题)

java - 在每个 Activity 上显示选项卡小部件

android - activity_main布局不加载设计,不显示任何内容

java - 无法识别的属性名称 MODULE(com.sun.tools.javac.util.SharedNameTable$NameImpl 类)