Gradle 6升级至7.x后输入属性丢失问题求助
Gradle 6升7后@Input注解File/FileCollection属性丢失问题修复
问题根源
- Gradle 7开始严格校验输入注解:
@Input不能用于File类型,必须用@InputFile或@InputDirectory,否则会触发你遇到的报错。 - 旧版直接用字段定义输入属性的方式,在Gradle 7中可能无法被正确识别为任务输入,导致
inputs.properties中丢失。 - 配置块属性名与任务类字段名不匹配(比如配置里的
buildDirectory对应任务类的someBuildDirectory),导致属性未正确注入。
修复步骤
1. 修正输入注解与属性类型(改用Gradle Property API)
Gradle 7推荐使用类型安全的Property API来定义任务输入,这能确保输入被正确追踪。修改任务类代码如下:
class SomeTask extends DefaultTask { // 避免类名与Gradle内置Task冲突 // 对应配置里的sourceDirectories @InputFiles final ConfigurableFileCollection someDirectories = project.files() // 对应配置里的ignoreFiles @InputFiles @Optional final ConfigurableFileCollection someIgnore = project.files() @Input @Optional final Property<Boolean> nullabilityAnnotations = project.objects.property(Boolean.class) // 对应配置里的buildDirectory,用@InputDirectory替代@Input(因为是目录) @InputDirectory @Optional final DirectoryProperty someBuildDirectory = project.objects.directoryProperty() // 配置块属性映射的setter,确保配置里的属性名能正确绑定到任务类属性 void setBuildDirectory(File file) { someBuildDirectory.set(file) } void setSourceDirectories(FileCollection files) { someDirectories.setFrom(files) } void setIgnoreFiles(FileTree fileTree) { someIgnore.setFrom(fileTree) } @TaskAction def run() { def params = [:] // 逐个读取输入属性,排除buildDirectory if (!someDirectories.isEmpty()) { params.someDirectories = someDirectories.files } if (someIgnore.isPresent() && !someIgnore.isEmpty()) { params.someIgnore = someIgnore.files } if (nullabilityAnnotations.isPresent()) { params.nullabilityAnnotations = nullabilityAnnotations.get() } // 后续使用params逻辑不变 } }
2. 确保配置块与任务类的属性绑定正确
原配置块无需修改,因为我们已经通过setter方法将配置里的buildDirectory、sourceDirectories、ignoreFiles映射到了任务类的对应属性。
3. 关键修正点说明
- 注解替换:将
@Input标记的File类型属性someBuildDirectory改为@InputDirectory(因为build是目录,如果是文件则用@InputFile)。 - Property API替换:用
ConfigurableFileCollection替代FileCollection,DirectoryProperty替代File,Property<Boolean>替代Boolean,这类API是Gradle 7增量构建和输入追踪的标准方式。 - setter方法:解决配置块属性名与任务类字段名不一致的问题,确保配置值能正确注入到任务属性中。
- 输入读取方式:在
@TaskAction中通过Property的get()或files集合获取值,替代原有的inputs.properties遍历,避免输入丢失。
验证修复
执行任务前先清理构建缓存:
./gradlew clean
然后运行目标任务,此时输入属性会被正确识别,不会再出现丢失或注解报错的问题。
内容的提问来源于stack exchange,提问作者One String Samurai
相关产品推荐
相关产品推荐

