Android Studio自定义gradle任务,具有依赖项-“;无法获取未知属性“;

Android Studio自定义gradle任务,具有依赖项-“;无法获取未知属性“;,android,android-studio,gradle,android-gradle-plugin,Android,Android Studio,Gradle,Android Gradle Plugin,我正在使用一个库,该库提供gradle任务以将构建上传到HockeyApp()。我认为它具体做什么并不重要,只是它创建了任务。我可以毫无问题地执行这些任务。我想创建一个任务来同时运行其中几个自定义任务。上传任务的名称类似于将[BuildVariant]上传到HockeyApp,它为每个构建变量创建了一个。我的自定义任务在项目级gradle文件的android中定义,如下所示: task uploadLegacyReleaseToHockeyApp(dependsOn: u

我正在使用一个库,该库提供gradle任务以将构建上传到HockeyApp()。我认为它具体做什么并不重要,只是它创建了任务。我可以毫无问题地执行这些任务。我想创建一个任务来同时运行其中几个自定义任务。上传任务的名称类似于将[BuildVariant]上传到HockeyApp,它为每个构建变量创建了一个。我的自定义任务在项目级gradle文件的
android
中定义,如下所示:

task uploadLegacyReleaseToHockeyApp(dependsOn:
            uploadVariant1ReleaseToHockeyApp,
            uploadVariant2ReleaseToHockeyApp,
            // etc
      ){}
同步gradle文件时,出现以下错误:

错误:(89,0)无法为com.android.build.gradle.AppExtension类型的对象获取未知属性“uploadVariant1ReleaseToHockeyApp”。

我已经检查了三次,没有输入错误,错误消息中的任务实际上存在。我是做错了什么,还是不可能对这样动态生成的任务编写依赖关系?我真的不知道插件是如何工作的,但它创建了自己的任务组,其中包含自动生成的任务

根据lukegv的回答更新:

如果使用
dependsOn
方法,则会出现以下错误:
错误:(90,0)无法获取任务的未知属性“uploadVariant1ToHockeyApp”:类型为org.gradle.api.DefaultTask的app:uploadLegacyReleaseToHockeyApp。

与构造器一起:

task uploadLegacyReleaseToHockeyApp(dependsOn:
            'uploadVariant1ToHockeyApp',
            'uploadVariant2ToHockeyApp',
            // etc
我发现:
找不到参数[{dependsOn=uploadVariant1ToHockeyApp},uploadVariant2ToHockeyApp,…

请注意,第一项是花括号,其余的不是


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

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

由于可以在整个构建脚本中添加或定义变量之类的内容,因此生成的任务通常在配置阶段结束时创建,因此在配置期间,它们不能作为范围中的属性使用

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

例如:

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
}

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

由于可以在整个构建脚本中添加或定义变量之类的内容,因此生成的任务通常在配置阶段结束时创建,因此在配置期间,它们不能作为范围中的属性使用

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

例如:

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
}

我用构造函数中的
dependsOn
进一步搜索后发现,它需要是一个数组,而不仅仅是字符串列表:

task taskName(dependsOn:
            ['otherTask1','otherTask2']){}

我不知道为什么
dependsOn
方法失败了,但我有一个有效的方法。

我让它工作了,在构造函数中用
dependsOn
进一步搜索后,它需要是一个数组,而不仅仅是一个字符串列表:

task taskName(dependsOn:
            ['otherTask1','otherTask2']){}

我不知道为什么
dependsOn
方法失败了,但我有一些有效的方法。

谢谢你花时间回答。我用结果编辑了这个问题,因为它太长了,无法发表评论。如果你想更新你的答案,以纳入我在我的帖子中的内容,我可以将其标记为正确。现在它还不是一个完全有效的解决方案因此,我不想误导任何人,但你肯定让我走上了正确的道路。谢谢你花时间回答。我用结果编辑了这个问题,因为它太长了,无法发表评论。如果你想更新你的答案,以纳入我在我的帖子中的内容,我可以将其标记为正确。现在,这还不是一个完全可行的解决方案o我不想误导任何人,但你肯定让我走上了正确的道路。事实上,
[]
是列表的Groovy符号。整个构造函数参数只是一个映射,其中
dependsOn
是一个键。键后是
,后跟条目值。在下一个
,一个新条目开始。这就是为什么需要一个列表来收集所有任务名称。实际上,
[]
是列表的Groovy符号。整个构造函数参数只是一个映射,其中
dependsOn
是一个键。键之后是
,后面是条目值。在下一个
,一个新条目开始。这就是为什么