如何在Gradle任务中不使用@Optional注解指定可选输入?
解决Gradle ':addWorkingCopyInfo' 任务的弃用警告与文件不存在问题
我来帮你搞定这两个Gradle相关的问题,一个是任务输入输出注册方式的弃用警告,另一个是指定文件不存在的报错,一步步来:
1. 修复TaskInputs/TaskOutputs弃用警告
从Gradle 5.0开始,官方移除了通过TaskInputs和TaskOutputs方法注册输入输出的老方式,推荐用注解式声明来定义任务的输入输出。你需要把原来的任务定义改成自定义任务类的形式:
原来的弃用写法
task addWorkingCopyInfo { inputs.file('/Users/robert/test/special-build-tag') outputs.file('some/output/file') // 任务执行逻辑 }
新的注解式写法
先创建一个自定义任务类,用@InputFile、@OutputFile等注解标记输入输出:
import org.gradle.api.DefaultTask import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction class AddWorkingCopyInfoTask extends DefaultTask { // 标记输入文件 @InputFile File specialBuildTagFile // 标记输出文件 @OutputFile File outputFile // 任务执行逻辑 @TaskAction void executeTask() { // 这里写原来任务里的业务逻辑,比如读取输入文件内容写入输出文件 if (specialBuildTagFile.exists()) { outputFile.text = specialBuildTagFile.text } } }
然后在构建脚本中注册这个任务:
task addWorkingCopyInfo(type: AddWorkingCopyInfoTask) { specialBuildTagFile = file('/Users/robert/test/special-build-tag') outputFile = file('path/to/your/output/file') }
2. 处理指定文件不存在的问题
针对文件/Users/robert/test/special-build-tag不存在的情况,你可以根据需求选下面两种方案:
方案一:将输入文件设为可选
如果这个文件是可选的(存在时使用,不存在时跳过相关处理),给@InputFile加上@Optional注解,Gradle就不会因为文件不存在报错了:
import org.gradle.api.tasks.Optional class AddWorkingCopyInfoTask extends DefaultTask { @Optional @InputFile File specialBuildTagFile @OutputFile File outputFile @TaskAction void executeTask() { if (specialBuildTagFile?.exists()) { // 文件存在时的处理逻辑 println "使用特殊构建标签文件: ${specialBuildTagFile.path}" } else { // 文件不存在时跳过处理 println "未找到特殊构建标签文件,跳过相关逻辑" } } }
方案二:让任务仅在文件存在时执行
如果文件不存在时整个任务都不需要执行,用onlyIf方法设置任务执行条件:
task addWorkingCopyInfo(type: AddWorkingCopyInfoTask) { specialBuildTagFile = file('/Users/robert/test/special-build-tag') outputFile = file('path/to/your/output/file') // 只有当文件存在时才执行任务 onlyIf { specialBuildTagFile.exists() } }
这样修改后,再运行gradle -Dorg.gradle.warning.mode=all命令,弃用警告会消失,文件不存在的问题也能按照你的需求处理了。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

