资讯动态

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

发布时间:2026/8/23 13:13:05 来源:尧图企业网站定制
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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价