AWS-PlantUML如何解决图标命名冲突:SHA1去重与递归命名空间生成机制全解析

发布时间:2026/10/13 5:38:46

AWS-PlantUML如何解决图标命名冲突:SHA1去重与递归命名空间生成机制全解析 AWS-PlantUML如何解决图标命名冲突SHA1去重与递归命名空间生成机制全解析【免费下载链接】AWS-PlantUMLPlantUML sprites, macros, and other includes for AWS components.项目地址: https://gitcode.com/gh_mirrors/aw/AWS-PlantUMLAWS-PlantUML 是一个为 PlantUML 提供 AWS 组件图标sprite、宏macro与构造型stereotype的开源工具包让你几行代码就能画出带官方 AWS 图标的架构图。当上千个 AWS 图标涌入同一仓库同名图标撞车几乎是必然的。本文带你完整拆解它如何用SHA1 去重与递归命名空间生成两大机制彻底解决图标命名冲突问题。图标命名冲突从何而来AWS 官方图标包遵循严格的文件命名规范见 README.mdCATEGORY_SERVICE_NAME[_SERVICE_COMPONENT][_LARGE]例如Storage_AmazonS3_bucket.png会被拆分为类别Storage / AmazonS3与组件名bucket解析逻辑见 puml.py。问题就出在这里bucket、table、action 这类子组件名在不同服务下大量重名。如果直接拿组件名生成宏名BUCKET、TABLE这些宏必然互相覆盖此外同一张图标图片还被 Amazon 放在多个分类目录下会产生完全相同图形的重复文件。AWS-PlantUML 的生成脚本 puml.py 用先去重、再递归加命名空间两步走解决了这两个问题。第一道防线SHA1 去重在 filter_duplicate_images() 中脚本对每张图标文件的原始字节计算 SHA1 摘要再用groupby按摘要分组同一组内只有 1 个文件 → 正常保留同一组内有多个文件即图片内容完全一致只是文件名/路径不同→只保留第一个。这一步的妙处在于它判断的不是名字是否相同而是内容是否相同。两个不同路径下像素级一致的图标只会生成一份宏与 sprite从源头消灭了重复定义带来的命名冲突。# puml.py 中的去重核心思路 def shasum(puml): h sha1() with open(puml.image_path, rb) as f: h.update(f.read()) return h.hexdigest()第二道防线递归命名空间生成去重之后仍会剩下名字相同、内容不同的图标。这时轮到 set_unique_names() 登场——一个教科书级的递归消歧函数按 expand_name() 生成的候选名排序并分组某组里只有 1 个图标 → 候选名即最终唯一名unique_name某组里有多个→ 只对这些冲突者递归调用自身expand 加 1候选名多拼一级父类别。以Storage_AmazonS3_bucket.png为例三轮候选名依次是轮次expand候选名说明第 1 轮0bucket只用组件名最简洁第 2 轮1AmazonS3_bucket加上父级服务名第 3 轮2Storage_AmazonS3_bucket加上顶层类别名必然唯一递归只在冲突子集内进行且候选名最长也只是完整命名空间因此必然收敛、必然终止——每个图标最终都拿到一个全局唯一的unique_name。双重宏输出与点分命名空间拿到唯一名后macros 属性 会做一件贴心的事当unique_name ! name时同时生成两份宏与两份 spritegenerate_sprite() 末尾追加了第二份定义。短名宏如BUCKET画图时最常用简洁好写全名宏如AMAZONS3_BUCKET当你同时需要多个不同来源的bucket时用它精确引用。此外namespaced_name 还会把路径转成点分命名空间如Storage.AmazonS3.bucket它被用作 INI 配置文件的 section 名。InheritingConfigParser 在查不到当前节时会自动向上逐级回退Storage.AmazonS3.bucket→Storage.AmazonS3→Storage这就是 awspuml.ini 中[Analytics]、[Analytics.AWSGlue]、[Analytics.AWSGlue.AWSGlue_LARGE]这种层次化配置可以按粒度覆盖颜色与实体类型的原因。; awspuml.ini 中的点分命名空间配置节 [Analytics] color: ${PUML.colors:orange} entity_type: node [Analytics.AWSGlue]最终效果几行代码画出 AWS 架构图以上机制全部发生在生成期画图时你只需 common.puml 里的PUML_ENTITY宏。以 examples/component-customization.puml 为例!include path/to/common.puml !include path/to/Storage/AmazonS3/AmazonS3.puml AMAZONS3(s3_internal,Default S3) AMAZONS3(s3_internal2,S3 as node,node) AMAZONS3_LARGE(s3_partner,Large S3)每个宏只需传别名 可选标签冲突消解、sprite 编码、构造型换行全部由生成机制在幕后完成。综合多个服务图标就能得到如 examples/comments-architecture.puml 这样的完整架构机制速查表机制解决的问题代码位置SHA1 去重内容相同的重复图标文件puml.py递归命名空间生成同名不同内容的图标puml.py双重宏 / 双 sprite 输出短名易用与精确引用的兼得puml.py点分命名空间 配置继承按分类粒度自定义样式puml.py 一句话总结先用 SHA1 保证相同内容只定义一次再用递归命名空间保证不同内容必有唯一名——两道防线组合起来就让上千个 AWS 图标宏可以和平共处而画图的人完全无感。【免费下载链接】AWS-PlantUMLPlantUML sprites, macros, and other includes for AWS components.项目地址: https://gitcode.com/gh_mirrors/aw/AWS-PlantUML创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/13 5:05:28

本地部署千问3.8-27B大模型:从环境配置到能力实测的完整指南

千问3.8-27B这类大模型,最吸引人的地方在于它宣称的“无审查”和“越狱”特性,这让很多开发者想把它部署在本地,用于代码生成、创意写作或特定领域的对话测试。但直接上手很容易踩坑,比如模型文件巨大、Ollama拉取失败、显存不足跑…

2026/10/13 5:35:00

三菱FX3U自动门控制全解析:从I/O分配到仿真调试与现场整定

上周去现场调一套商场平移门的改造,甲方拍着胸脯说:“就电机正反转,PLC控制,带防夹,一天能搞完。”结果从IO分配到仿真验证,再到现场整定,我整整蹲了三天。自动门系统控制确实不是什么高深技术&…

2026/10/13 5:35:00

Scala Map实战指南:从创建遍历到groupBy与并发避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

BC28模组MQTT接入ONENET实战:避坑指南与低功耗优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

iOS原生侧滑菜单实现原理与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:00

STM32F407芯片架构深度解析:总线矩阵、CCM RAM与ART加速器实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:30:00

从I²C到PCIe:计算机总线协议选型与体系结构全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑