Android Studio自定义gradle任务,具有依赖项-“;无法获取未知属性“;
我正在使用一个库,该库提供gradle任务以将构建上传到HockeyApp()。我认为它具体做什么并不重要,只是它创建了任务。我可以毫无问题地执行这些任务。我想创建一个任务来同时运行其中几个自定义任务。上传任务的名称类似于将[BuildVariant]上传到HockeyApp,它为每个构建变量创建了一个。我的自定义任务在项目级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
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
是一个键。键之后是:
,后面是条目值。在下一个,一个新条目开始。这就是为什么