gpt4 book ai didi

java - Gradle 的 Java 项目 API 不提供在 project.sync 中保留 API 的访问权限

转载 作者:行者123 更新时间:2023-12-02 02:04:36 25 4
gpt4 key购买 nike

我编写了一个 Gradle 插件,主要用 Java 和一些 Groovy 编写。我正在尝试访问项目 API,特别是 Project.sync 方法。我能够让大多数事情正常工作,但我无法弄清楚如何访问底层同步任务的“保留”方法。

我尝试将传递给 Action 的对象转换为传递给 Project.sync 的对象,但该对象似乎是某种内部 Gradle CopySpecWrapper 对象,并且不清楚如何访问公开 preserve 的 Sync 任务对象方法。

这是相关的代码片段,显示了我如何尝试解决该问题:

project.sync(new Action<CopySpec>() {
public void execute(CopySpec copySpec) {
copySpec.from(project.zipTree(myArchive));
copySpec.into(expandDir);
if (copySpec instanceof Sync) {
Sync sync = (Sync) copySpec;
sync.preserve(new Action<PatternFilterable>() {
@Override
public void execute(PatternFilterable patt) {
patt.include("**/*");
patt.exclude("myArchive/**/*");
}
});
} else {
throw new RuntimeException("Unable to resolve Sync task to preserve existing files.");
}
}
});

在我的例子中,遇到了 RuntimeException。

寻找调用 Project.sync 的正确方法,并能够为同步任务的保留功能配置模式过滤器。

最佳答案

这是一个known bug 。当他们引入 project.sync 方法时,他们似乎忘记了任务类型特定的 preserve 方法。

请注意,此错误并不是您的代码导致抛出 RuntimeException 的唯一原因。即使没有错误,您也无法将传递的 CopySpec 转换为任务类型 Syncproject.sync 方法与任务类型 Sync 无关,它们只是共享相同的配置接口(interface)。

目前,无法将 preserveproject.sync 结合使用。两种可能的解决方法是:

  1. 使用同步类型的任务。实际上,无论如何,这应该是首选方式,因为文件删除/复制之类的操作无论如何都不应该在配置阶段发生(而且看起来您希望您的插件以这种方式运行)。
  2. 应该可以通过连续调用 project.deleteproject.copy 来模仿 project.sync 方法的行为。您可以将 FileCollection 传递给 delete 方法,以排除要保留的文件。对于 copy 方法,您可能需要将 duplicatesStrategy 设置为 exclude 以防止覆盖保留的文件。

关于java - Gradle 的 Java 项目 API 不提供在 project.sync 中保留 API 的访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57362674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com