尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AtomUI Source Generator 源码解析:主题 Token 与控制注册如何自动生成

AtomUI Source Generator 源码解析:主题 Token 与控制注册如何自动生成 AtomUI Source Generator 源码解析主题 Token 与控制注册如何自动生成【免费下载链接】AtomUIAn enhancement and extension library for Avalonia, bringing the Ant Design design language, modern controls, theming, native integrations, and cross-platform UI capabilities to .NET desktop apps.项目地址: https://gitcode.com/gh_mirrors/at/AtomUIAtomUI 是一款为 .NET 桌面应用带来 Ant Design 设计语言的 Avalonia 增强库而AtomUI Source Generator源码生成器是它的自动化核心在编译期自动扫描主题 Token 定义与控件包生成强类型资源键、主题 Schema 与包级注册代码。本文带你用 5 分钟读懂这条从特性标记到代码落地的完整流水线。先搞懂AtomUI 源码生成器到底是什么简单来说它是一个Roslyn 增量源生成器IIncrementalGenerator以 Analyzer 的形式随 NuGet 包分发编译时由编译器加载不进入运行时、也不增加应用体积项目目标框架为netstandard2.0标记IsRoslynComponent true打包时 DLL 被放入包的analyzers/dotnet/cs目录见 src/AtomUI.Generator/AtomUI.Generator.csproj。你只需给 Token 类打上特性编译器就会变出一整组强类型代码——无需维护任何手工清单也没有运行时程序集扫描。第一步用特性标记主题 Token生成器的眼睛是几个约定好的特性全部登记在 src/AtomUI.Generator/TargetMarkConstants.cs[GlobalDesignToken(MyTheme)] public static class MyThemeTokens { [DesignTokenKind(0)] // 0Seed, 1Map, 2Alias public static Color PrimaryColor { get; set; } }[GlobalDesignToken]声明一组全局 Token[DesignTokenKind]标注 Seed/Map/Alias 三阶段[NotTokenDefinition]可排除个别属性。[ControlDesignToken]声明某个控件的私有OwnToken。生成器通过 Roslyn 的ForAttributeWithMetadataName精准定位这些特性见 src/AtomUI.Generator/TokenResourceKeyGenerator.cs再由TokenPropertyWalker这个语法树遍历器逐个属性收集 Token 名称、类型与阶段见 src/AtomUI.Generator/DesignToken/TokenPropertyWalker.cs。第二步Token 资源键如何自动生成收集完成后ResourceKeyClassWriter会输出生成文件TokenResourceConst.g.cs见 src/AtomUI.Generator/DesignToken/ResourceKeyClassWriter.cs包含三类内容生成物作用SharedTokenKind枚举所有全局 Token 的强类型清单取代字符串资源键每控件一个 TokenKey 枚举全局 Token 用正整数槽位控件 Own Token 用负数槽位-1 - index编码TokenResourceExtension子类把枚举值映射为真正的ControlTokenResourceKey越界自动抛异常这意味着你在 XAML 或 C# 中引用 Token 时拼错名字会在编译期就报错而不是运行期静默失效。第三步控件注册如何自动生成除了 Token生成器还会分析构建系统提供的Themes/**/*.axaml主题资产自动完成三件事为每个控件生成唯一ControlTokenIdentity与 descriptor写入主题 SchemaGeneratedThemeSchemaWriter见 src/AtomUI.Generator 目录说明生成包级资产清单GeneratedControlThemeAssetManifest记录资产归属与引用关系生成包级注册入口GeneratedControlPackageRegistration.Register(...)见 src/AtomUI.Generator/Registration/ControlPackageRegistrationWriter.cs。注册代码会按includeIdentity过滤器挑选控件与资产并自动处理资产引用了被排除控件的联动裁剪。最终你只需要在应用启动时调用一次UseXxxControls()入口——不必逐控件、逐主题手工注册。生成器全家福不止 Token 一件事AtomUI.Generator实际承担了一组编译期职责完整说明见 docs/modules/generator/overview.md生成器一句话职责TokenResourceKeyGenerator核心Token 资源键、主题 Schema、资产清单、包级注册LocalizationGenerator由[LanguageCatalog]枚举 XLIFF 2.1 生成强类型本地化扩展LanguageTagsGenerator生成常用 BCP 47 语言标签常量DataMemberAccessorGenerator为 AOT 生成数据成员访问器注册避免反射ScopedResourceHostGenerator为非 Visual 对象生成资源宿主生命周期样板Linked-publish 系列仅在 AOT/Trim 发布时生成 Sidecar 与应用级注册计划普通编译完全排除如何验证生成结果是否完整在任何一个控件包项目中构建后查看GeneratedFiles/AtomUI.Generator/目录应能确认四类输出齐全exact CLR identity、强类型 Token 键、descriptor/资产清单、包级注册代码。这些生成文件被Compile Remove排除、不入库不要手工修改把它们当作编译器打印的收据来阅读即可。小结为什么这套设计值得学习约定优于配置特性 目录约定Themes/**/*.axaml取代手工清单编译期即反馈Token 拼写错误、粒度配置错误都会以诊断形式直接报在编辑器里AOT 友好强类型键 静态注册计划让 .NET Native/Trim 场景不再依赖反射扫描。延伸阅读docs/modules/generator/linked-registration.mdLinked Registration 深度解析与 docs/architecture/foundations/aot-linked-registration-pipeline.mdAOT 注册管线架构。【免费下载链接】AtomUIAn enhancement and extension library for Avalonia, bringing the Ant Design design language, modern controls, theming, native integrations, and cross-platform UI capabilities to .NET desktop apps.项目地址: https://gitcode.com/gh_mirrors/at/AtomUI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表