
云原生容器编排【免费下载链接】k3dLittle helper to run CNCFs k3s in Docker项目地址https://gitcode.com/gh_mirrors/k3/k3d点击查看免费下载k3dk3s in Docker是一个用来在 Docker 中快速创建、运行 k3s 集群的 CLI 包装工具其全部命令基于 Cobra 框架实现。为了让k3d.io文档站点的命令参考Command Reference与 CLI 的实际能力保持同步仓库中内置了一个专门的文档生成模块docgen。本文将以 docgen/README.md 为核心完整讲解该模块的定位、运行方式、源码原理、生成产物及其与 MkDocs 文档站点的集成方式读完你即可在本仓库中一键重新生成全部命令行参考文档并理解文档随代码自动更新的实现机制。docgen 的定位与设计目标docgen/README.md 开篇即明确了该模块的唯一职责Only used to generate the command tree for https://k3d.io/stable/usage/commands. The code will output files in../docs/usage/commands/翻译过来就是docgen 只做一件事——为 k3d 文档站点生成命令树command tree文档。它是一个典型的文档生成器doc generator独立模块不参与 k3d 二进制本身的构建而是以 k3d 的 CLI 源码为输入自动产出 Markdown 格式的命令参考页面。它体现的核心工程理念是单一事实来源Single Source of TruthCLI 的命令结构、参数、用法示例都定义在代码里文档由代码驱动生成从而避免代码改了一版、文档还停留在旧版的经典漂移问题。docgen 模块的文件结构非常精简docgen/ ├── README.md # 使用说明本文依据 ├── main.go # Go 入口调用 Cobra 的文档生成器 ├── run.sh # 一键脚本环境准备、编译运行、清理还原 ├── go.mod # 独立 Go module依赖 cobra 与 k3d 本体 └── go.sum快速开始一条命令生成全部命令文档按照 docgen/README.md 的 Run 章节生成文档只需要两步# 确保你在 docgen 目录内因为指向 docs/ 目录的相对路径是硬编码的 cd docgen # 运行一键脚本 ./run.sh原文档特别强调必须先在 docgen 目录下再执行脚本原因在于脚本内部对文档输出目录的处理依赖docgen目录在仓库中的固定位置详见下文 run.sh 分析。运行结束后打开 docs/usage/commands/ 目录即可看到新生成的命令文档k3d.io站点上的stable/usage/commands页面正是由这些文件渲染而来。运行原理main.go 与 run.sh 的协作main.goCobra 文档生成的入口docgen 的核心逻辑非常短整个 docgen/main.go 只有十几行有效代码package main import ( github.com/k3d-io/k3d/v5/cmd l github.com/k3d-io/k3d/v5/pkg/logger github.com/spf13/cobra/doc ) func main() { k3d : cmd.NewCmdK3d() k3d.DisableAutoGenTag true if err : doc.GenMarkdownTree(k3d, ./docs/usage/commands); err ! nil { l.Log().Fatalln(err) } }逐行拆解其工作原理cmd.NewCmdK3d()调用 k3d 主模块 cmd/root.go 中定义的工厂函数构建出完整的 Cobra 根命令对象。也就是说docgen 复用的正是 k3d 二进制实际使用的命令树——这是文档与代码零偏差的根本保证。k3d.DisableAutoGenTag true关闭 Cobra 文档生成器默认添加的 Auto generated by spf13/cobra 文件头标记让生成页面更干净对照 docs/usage/commands/k3d.md 可见确实没有该标记。doc.GenMarkdownTree(k3d, ./docs/usage/commands)这是spf13/cobra/doc包提供的核心 API它递归遍历整棵命令树为每个命令生成一个独立的 Markdown 文件写入./docs/usage/commands目录。注意这里的相对路径是相对于 docgen 进程的工作目录即docgen/这正是 README 要求先cd docgen的原因。命令树的来源cmd/root.go要理解 docgen 能生成哪些文档就要看它依赖的命令树本身。cmd/root.go 中NewCmdK3d()通过rootCmd.AddCommand(...)注册了以下一级子命令子命令用途对应源码目录cluster管理集群create/start/stop/delete/list/editcmd/cluster/completion为 bash/zsh/fish/powershell 生成补全脚本cmd/root.goconfig配置文件操作init/migratecmd/config/image镜像处理importcmd/image/kubeconfigkubeconfig 管理get/mergecmd/kubeconfig/node节点管理create/start/stop/delete/list/editcmd/node/registry私有镜像仓库管理create/delete/listcmd/registry/version显示 k3d 与默认 k3s 版本cmd/root.godebug、runtime-info调试与运行时信息runtime-info被标记为Hidden不会出现在公开文档中cmd/debug/根命令还定义了三个全局持久化 Flag--verbose、--trace、--timestamps以及--version它们会作为 Options inherited from parent commands 自动出现在每个子命令文档页中。可以推断任何对命令树新增命令、修改 flag、调整用法示例的修改都会在重新运行 docgen 后同步反映到文档中这是该模块最核心的维护价值。run.sh环境准备与收尾清理docgen/run.sh 是一个自包含的一键脚本承担了引用本地 k3d 源码 → 生成文档 → 还原仓库状态的全流程#!/bin/bash REPLACE_PLACEHOLDER/PATH/TO/YOUR/REPO/DIRECTORY CURR_DIR$( cd $( dirname ${BASH_SOURCE[0]} ) /dev/null 21 pwd ) [ -d $CURR_DIR ] || { echo FATAL: no current dir (maybe running in zsh?); exit 1; } REPO_DIR${CURR_DIR%/docgen} # 去掉末尾的 /docgen得到仓库根目录 echo $REPO_DIR sed -i s%$REPLACE_PLACEHOLDER%$REPO_DIR% $CURR_DIR/go.mod go mod tidy go mod vendor go run ./main.go sed -i s%$REPO_DIR%$REPLACE_PLACEHOLDER% $CURR_DIR/go.mod rm -r $CURR_DIR/vendor脚本的关键设计点自动推导仓库根目录通过CURR_DIR%/docgen把当前脚本所在路径末尾的docgen去掉得到仓库绝对路径无需手动配置。占位符替换机制脚本预设了占位符/PATH/TO/YOUR/REPO/DIRECTORY第一步用sed将 docgen/go.mod 中的占位符替换为真实仓库路径使 docgen 模块能够以本地路径引用 k3d 源码而不是去模块仓库拉取发布版从而保证生成的文档反映当前 checkout 的代码。标准 Go 构建流程依次执行go mod tidy整理依赖、go mod vendor拉取 vendor 依赖、go run ./main.go编译并运行生成器。状态还原生成完毕后再次sed把真实路径还原为占位符并删除vendor目录确保仓库在提交时保持干净、可复现。此外仓库根目录的 go.work 声明了 Go workspaceuse包含根模块、./docgen、./tools三个模块因此在 workspace 环境下docgen 中的import github.com/k3d-io/k3d/v5/cmd会直接解析到本地根模块源码这正是整个生成链路能够以当前代码为准的支撑。生成产物docs/usage/commands/ 目录详解运行 docgen 后docs/usage/commands/ 目录下会生成约 30 个 Markdown 文件覆盖根命令与全部公开子命令docs/usage/commands/ ├── k3d.md # 根命令总览 ├── k3d_cluster.md # cluster 命令组 ├── k3d_cluster_create.md # 集群创建参数最丰富的一页 ├── k3d_cluster_delete.md ├── k3d_cluster_edit.md ├── k3d_cluster_list.md ├── k3d_cluster_start.md ├── k3d_cluster_stop.md ├── k3d_completion.md # shell 补全 ├── k3d_config.md / k3d_config_init.md / k3d_config_migrate.md ├── k3d_image.md / k3d_image_import.md ├── k3d_kubeconfig.md / k3d_kubeconfig_get.md / k3d_kubeconfig_merge.md ├── k3d_node.md / k3d_node_create.md / k3d_node_delete.md ├── k3d_node_edit.md / k3d_node_list.md / k3d_node_start.md / k3d_node_stop.md ├── k3d_registry.md / k3d_registry_create.md ├── k3d_registry_delete.md / k3d_registry_list.md ├── k3d_version.md / k3d_version_list.md每个文件都遵循 Cobra 文档生成器的标准结构## 命令名→Synopsis含用法→### Options本地 flag 表→### Options inherited from parent commands全局 flag→### SEE ALSO父子命令相互链接。以根命令页 docs/usage/commands/k3d.md 为例其 Options 部分完整列出了 4 个根级 flag-h, --help help for k3d --timestamps Enable Log timestamps --trace Enable super verbose output (trace logging) --verbose Enable verbose output (debug logging) --version Show k3d and default k3s version而参数最丰富的 docs/usage/commands/k3d_cluster_create.md 则把创建集群的完整参数表沉淀了下来包括-s, --servers/-a, --agents服务器与代理节点数量--api-port [HOST:]HOSTPORT暴露在 LoadBalancer 上的 Kubernetes API 端口示例k3d cluster create --servers 3 --api-port 0.0.0.0:6550-p, --port [HOST:][HOSTPORT:]CONTAINERPORT[/PROTOCOL][NODEFILTER]端口映射示例k3d cluster create --agents 2 -p 8080:80agent:0 -p 8081agent:1-e, --env KEY[VALUE][NODEFILTER[;NODEFILTER...]]注入环境变量示例-e HTTP_PROXYmy.proxy.comserver:0--k3s-arg ARGNODEFILTER[;NODEFILTER]透传 k3s 启动参数示例--k3s-arg --disabletraefikserver:0--registry-create NAME[:HOST][:HOSTPORT]/--registry-use创建或挂载私有镜像仓库--volume、--label、--runtime-label、--runtime-ulimit、--subnet、--timeout、--token、--no-lb、--no-rollback等高级选项。这些参数说明全部来自 cmd/cluster/clusterCreate.go 中 Flag 注册时填写的 Usage 文本意味着文档中的每一个参数、每一行示例都直接对应一段真实可执行的 CLI 代码。此外docs/usage/commands.md 提供了一棵纯文本形式的全局命令树速查表把全部命令、flag 与默认值浓缩在一页里便于快速浏览与检索。与 MkDocs 文档站点的集成docgen 的产出最终由 MkDocs 渲染成k3d.io上的stable/usage/commands页面。仓库根目录的 mkdocs.yml 揭示了这套文档站点的技术栈主题mkdocs-material启用navigation.tabs、navigation.expand、navigation.path、搜索建议与高亮等特性版本化文档通过mike插件提供多版本切换version_selector: true、canonical_version: null这就是 URL 中出现/stable/版本前缀的原因自动导航显式注释了nav: omitted改用awesome-pages插件按目录结构自动生成导航docs/usage/commands/下的每个 Markdown 文件因此会自然成为命令参考的子页面严格模式strict: true任何 mkdocs 构建警告都会中止处理倒逼生成的文档始终是合法、完整的 Markdown。可以推断的发布流程是开发者修改 CLI 源码后执行 docgen 重新生成命令文档再提交这些 Markdown 变更最后由 CI 用mike deploy发布到stable版本通道。整个链路保证了站点命令参考与二进制行为始终一致。常见问题与注意事项结合源码实现使用 docgen 时有几点需要留意必须在 docgen 目录内运行main.go中的输出路径./docs/usage/commands是相对工作目录的硬编码脱离docgen目录执行会导致文件被写入错误位置。生成文件会被覆盖docs/usage/commands/ 下的文件是生成物而非手写文档直接修改后再次运行 docgen 会丢失改动如需调整应修改cmd/下对应命令的Use/Short/Long/Flag Usage 文本再重新生成。依赖本地源码而非发布版脚本通过 go.mod 占位符替换与 go.work workspace 保证 docgen 引用的是当前 checkout 的 k3d 代码因此在未提交的本地修改上运行也能生成最新文档这正是调试文档的理想方式。隐藏命令不产生文档页例如根命令中Hidden: true的runtime-info以及 registry 的 start/stop 等未在公开命令树中注册的命令不会出现在生成结果中这也解释了为何 docs/usage/commands/ 中不存在对应页面。小结docgen 是 k3d 仓库中一个小而美的自动化文档模块以spf13/cobra/doc为核心以cmd.NewCmdK3d()构建的完整命令树为输入一条./run.sh即可在数秒内把 CLI 的全部命令、参数与示例沉淀为 MkDocs 可直接渲染的 Markdown 页面。对于任何以 Cobra 构建 CLI、且希望文档永远跟随代码的 Go 项目docgen 的这套模式独立 docgen 模块 本地源码引用 脚本化生成 版本化发布都是一份值得直接参考的范本。赞分享云原生容器编排【免费下载链接】k3dLittle helper to run CNCFs k3s in Docker项目地址https://gitcode.com/gh_mirrors/k3/k3d点击查看免费下载相关推荐rclone gendocs 命令解析从 Cobra 命令树到 Hugo 命令文档的自动生成流水线rclone gendocs 命令解析从 Cobra 命令树到 Hugo 命令文档的自动生成流水线 rclone gendocs 是 rclone 的文档自举CLI数据同步对象存储Cobra 文档生成实战用 spf13/cobra/doc 包为命令树自动生成 ReST 文档Cobra 文档生成实战用 spf13/cobra/doc 包为命令树自动生成 ReST 文档 本文以 Cobra 仓库的 ReST 文档生成指南 httpsCLI开发工具Ory Hydra CLI 根命令参考从 hydra [flags] 到完整命令树与文档生成机制Ory Hydra CLI 根命令参考从 hydra flags 到完整命令树与文档生成机制 导读 本文以 Ory Hydra 仓库中自动生成的 CLI 参考认证鉴权后端上一篇RPCS3 中文界面 3 分钟搞定PS3 模拟器汉化配置完整指南下一篇R1-searcher部署教程基于vLLM与Ray的分布式训练加速方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考