您可以在支持 Gradle 的 IDE 中打开此示例。 |
本示例展示了如何通过 Problems API 发出问题以及 IDE 端如何使用这些报告。访问用户手册可了解更多关于Problems API 的信息。
运行示例
要运行示例,请执行 ./gradlew :sample-ide:importBuild
命令。
项目结构
此示例由多个独立构建组成,并通过以下布局构成一个复合构建:
-
sample-project
: 包含报告问题插件的 Gradle 构建 -
sample-ide
: 模拟 IDE 功能的项目。换句话说,它使用 Gradle Tooling API 配置和运行sample-project
构建,并打印在此过程中接收到的问题报告。 -
reporters/standard-plugin
展示了 Problems API 在标准 Gradle 插件中的用法。 -
reporters/model-builder-plugin
展示了如何在使用 Tooling API 读取项目配置时使用 Problems API 报告问题。 -
reporters/script-plugin
展示了如何在预编译脚本插件中使用 Problems API。
发出问题
问题可以通过注入的 Problems
服务发出。以下是从插件报告问题(包括添加自定义附加数据)的示例:
ProblemId problemId = ProblemId.create("adhoc-plugin-deprecation", "Plugin is deprecated", PROBLEM_GROUP);
problems.getReporter().report(problemId, problem -> problem
.contextualLabel("The 'standard-plugin' is deprecated")
.documentedAt("https://github.com/gradle/gradle/README.md")
.severity(Severity.WARNING)
.solution("Please use a more recent plugin version")
.additionalData(SomeAdditionalData.class, additionalData -> {
additionalData.setName("Some name");
additionalData.setNames(java.util.Arrays.asList("name1", "name2"));
})
);
接收问题报告
问题以 Tooling API 进度事件的形式发出。可以通过注册 ProgressListener
进行处理。
@Override
public void statusChanged(ProgressEvent progressEvent) {
if (progressEvent instanceof SingleProblemEvent) {
prettyPrint((SingleProblemEvent) progressEvent);
} else if (progressEvent instanceof ProblemSummariesEvent) {
prettyPrint((ProblemSummariesEvent) progressEvent);
}
}
接收自定义附加数据
要在 Tooling API 端读取自定义附加数据,您需要一个 view type。
view type 代表您想要访问底层数据的接口或类。API 将返回此类型的一个实现,提供数据的特定“视图”,从而允许对底层数据进行类型安全的访问。view type 必须与实际数据结构兼容。
您的 view type 可以包含基于以下规则的各种属性:
-
简单类型 (
String
,Integer
,Boolean
等) -
集合 (
List
,Set
,Map
) -
由上述类型组成的复合类型
-
Gradle Provider API 类型,这些类型会自动映射到其对应的类型
更多信息,请参阅 CustomAdditionalData。
这个 view type 可以用来检索存储在问题实例中的附加数据
interface SomeDataView {
String getName();
List<String> getNames();
}
这个 view type 可以用来检索存储在问题实例中的附加数据
AdditionalData data = problem.getAdditionalData();
if (data instanceof CustomAdditionalData) {
System.out.println(" - additional data: " + ((CustomAdditionalData) data).get(SomeDataView.class).getName());
}