Kotlin/Dokka 插件开发教程:实现隐藏内部API的文档生成插件
dokka API documentation engine for Kotlin 项目地址: https://gitcode.com/gh_mirrors/do/dokka
前言
在Kotlin项目开发中,良好的API文档对于团队协作和代码维护至关重要。Dokka作为Kotlin的官方文档生成工具,提供了强大的插件机制允许开发者扩展其功能。本文将手把手教你开发一个实用的Dokka插件,用于自动隐藏标记为内部的API文档。
插件功能概述
我们将开发一个名为HideInternalApiPlugin
的Dokka插件,它能自动识别并过滤掉被@Internal
注解标记的类、函数等元素,使其不出现在最终生成的文档中。这种功能在企业级开发中非常实用,可以保护内部实现细节不被公开暴露。
开发环境准备
- 使用Dokka插件模板创建项目
- 重命名默认包名为
org.example.dokka.plugin
- 修改主插件类名为
HideInternalApiPlugin
- 更新
META-INF/services
中的服务注册文件 - 在
build.gradle.kts
中配置正确的groupId和版本号
核心实现原理
Dokka的文档生成过程分为多个阶段,我们需要在预处理阶段(PreMergeDocumentableTransformer
)介入,过滤掉不应出现在文档中的元素。
继承抽象过滤器
Dokka已经提供了一个方便的抽象类SuppressedByConditionDocumentableFilterTransformer
,我们只需实现其shouldBeSuppressed
方法:
class HideInternalApiTransformer(context: DokkaContext) :
SuppressedByConditionDocumentableFilterTransformer(context) {
override fun shouldBeSuppressed(d: Documentable): Boolean {
// 实现过滤逻辑
}
}
注解检测实现
通过分析Documentable对象的extra属性,我们可以获取到元素上的所有注解:
val annotations: List<Annotations.Annotation> =
(d as? WithExtraProperties<*>)
?.extra
?.allOfType<Annotations>()
?.flatMap { it.directAnnotations.values.flatten() }
?: emptyList()
然后检查是否存在目标注解:
private fun isInternalAnnotation(annotation: Annotations.Annotation): Boolean {
return annotation.dri.packageName == "org.jetbrains.dokka.internal.test"
&& annotation.dri.classNames == "Internal"
}
插件注册
在插件主类中注册我们的转换器:
class HideInternalApiPlugin : DokkaPlugin() {
val myFilterExtension by extending {
plugin<DokkaBase>().preMergeDocumentableTransformer providing ::HideInternalApiTransformer
}
}
调试技巧
- 使用
publishToMavenLocal
发布插件到本地仓库 - 在测试项目中引用本地插件版本
- 通过
-Dorg.gradle.debug=true
启用调试 - 在IDE中附加远程调试器
- 观察Documentable对象的结构和属性
单元测试实践
Dokka提供了完善的测试基础设施,我们可以编写自动化测试验证插件行为:
class HideInternalApiPluginTest : BaseAbstractTest() {
@Test
fun `should hide annotated functions`() {
testInline(
"""
|package org.jetbrains.dokka.internal.test
|
|annotation class Internal
|
|fun shouldBeVisible() {}
|
|@Internal
|fun shouldBeExcludedFromDocumentation() {}
""".trimMargin(),
pluginOverrides = listOf(HideInternalApiPlugin())
) {
preMergeDocumentablesTransformationStage = { modules ->
// 验证结果
assertEquals(1, packageFunctions.size)
assertEquals("shouldBeVisible", packageFunctions[0].name)
}
}
}
}
进阶思考
- 配置化:可以将注解类名和包名改为可配置的,增加灵活性
- 性能优化:对于大型项目,可以考虑缓存注解检查结果
- 多注解支持:扩展支持多种内部注解标记
- 日志记录:添加过滤日志,方便排查问题
总结
通过本教程,我们完成了一个实用的Dokka插件开发,实现了以下目标:
- 理解了Dokka插件的基本架构
- 掌握了Documentable模型的操作方法
- 学会了如何注册和调试Dokka扩展
- 实践了Dokka插件的单元测试方法
这种插件开发模式可以扩展到更多场景,如:
- 基于自定义规则的文档过滤
- 文档内容的增强和修改
- 生成额外的文档格式或元数据
希望本教程能帮助你入门Dokka插件开发,为你的项目打造更符合需求的文档生成方案。
dokka API documentation engine for Kotlin 项目地址: https://gitcode.com/gh_mirrors/do/dokka
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考