任务构造方法中调用getProject()是否兼容Gradle配置缓存?
Gradle配置缓存兼容:Task构造方法调用getProject()的可行性验证
Gradle文档明确要求:要兼容配置缓存,绝对不能在Task类的@TaskAction方法里调用getProject()。现在有一段代码,打算用DirectoryProperty替代getProject().getRootDir()来表示根项目目录,并且在Task的构造方法里调用了getProject(),下面来验证这种做法是否可行。
待验证代码
public abstract class AbstractMyTask extends DefaultTask { @Internal protected abstract DirectoryProperty getRootDirectory(); protected AbstractMyTask() { getRootDirectory().convention(getProject().getRootProject().getLayout().getProjectDirectory()); } }
可行性分析
配置缓存的限制范围
配置缓存的核心限制针对任务执行阶段(即@TaskAction标注的方法),因为这个阶段Task已被序列化存入缓存,此时调用getProject()会引入无法序列化的项目引用,直接破坏缓存的有效性和复用性。构造方法调用的合法性
Task的构造方法属于配置阶段的操作,此时项目模型已完成初始化,调用getProject()是完全安全的。这里只是用它为DirectoryProperty设置默认值,属于配置阶段的常规操作,不会触发配置缓存的禁用规则。DirectoryProperty的缓存友好性
代码中使用DirectoryProperty存储根目录,这本身就是Gradle推荐的配置缓存友好做法——这类属性API的对象是可序列化的,完全符合配置缓存对Task状态序列化的要求,替代getProject().getRootDir()的思路是正确的。
结论
这段代码的实现完全兼容Gradle配置缓存,在Task构造方法中调用getProject()的做法是可行的。
内容的提问来源于stack exchange,提问作者Kelvin Chung
相关产品推荐
相关产品推荐

