Kotlin/Dokka 插件开发教程:实现隐藏内部API的文档生成插件

Kotlin/Dokka 插件开发教程:实现隐藏内部API的文档生成插件

dokka API documentation engine for Kotlin dokka 项目地址: https://gitcode.com/gh_mirrors/do/dokka

前言

在Kotlin项目开发中,良好的API文档对于团队协作和代码维护至关重要。Dokka作为Kotlin的官方文档生成工具,提供了强大的插件机制允许开发者扩展其功能。本文将手把手教你开发一个实用的Dokka插件,用于自动隐藏标记为内部的API文档。

插件功能概述

我们将开发一个名为HideInternalApiPlugin的Dokka插件,它能自动识别并过滤掉被@Internal注解标记的类、函数等元素,使其不出现在最终生成的文档中。这种功能在企业级开发中非常实用,可以保护内部实现细节不被公开暴露。

开发环境准备

  1. 使用Dokka插件模板创建项目
  2. 重命名默认包名为org.example.dokka.plugin
  3. 修改主插件类名为HideInternalApiPlugin
  4. 更新META-INF/services中的服务注册文件
  5. 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
    }
}

调试技巧

  1. 使用publishToMavenLocal发布插件到本地仓库
  2. 在测试项目中引用本地插件版本
  3. 通过-Dorg.gradle.debug=true启用调试
  4. 在IDE中附加远程调试器
  5. 观察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)
            }
        }
    }
}

进阶思考

  1. 配置化:可以将注解类名和包名改为可配置的,增加灵活性
  2. 性能优化:对于大型项目,可以考虑缓存注解检查结果
  3. 多注解支持:扩展支持多种内部注解标记
  4. 日志记录:添加过滤日志,方便排查问题

总结

通过本教程,我们完成了一个实用的Dokka插件开发,实现了以下目标:

  1. 理解了Dokka插件的基本架构
  2. 掌握了Documentable模型的操作方法
  3. 学会了如何注册和调试Dokka扩展
  4. 实践了Dokka插件的单元测试方法

这种插件开发模式可以扩展到更多场景,如:

  • 基于自定义规则的文档过滤
  • 文档内容的增强和修改
  • 生成额外的文档格式或元数据

希望本教程能帮助你入门Dokka插件开发,为你的项目打造更符合需求的文档生成方案。

dokka API documentation engine for Kotlin dokka 项目地址: https://gitcode.com/gh_mirrors/do/dokka

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尤辰城Agatha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值