Stride 编译器服务诊断规则 STRDIAG011:解析 Roslyn Analyzer 发布追踪文件与未声明项目资源扩展名告警

发布时间:2026/9/28 7:16:45
Stride 编译器服务诊断规则 STRDIAG011:解析 Roslyn Analyzer 发布追踪文件与未声明项目资源扩展名告警 游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载导读本文聚焦 Stride 游戏引擎Stride.Core.CompilerServices 模块中的 Roslyn 分析器发布追踪Analyzer Release Tracking机制深入解读 AnalyzerReleases.Unshipped.md 所记录的、处于未发布状态的构建诊断规则STRDIAG011UndeclaredProjectAssetExtension。文章将说明该规则在引擎资源Asset构建管线中的作用、其底层实现原理、与 MSBuild 属性StrideProjectAssetExtensions的联动关系以及开发者如何在自定义资源类型项目中正确规避该告警。读完本文你将理解 Stride 分析器规则的生命周期管理方式以及资源文件扩展名未声明即被静默丢弃这一隐患的发现与修复方法。一、AnalyzerReleases 文件Stride 分析器规则的版本台账Roslyn 分析器工程遵循 Microsoft.CodeAnalysis.Analyzers 的发布追踪约定每个诊断规则DiagnosticDescriptor必须登记在AnalyzerReleases.Shipped.md已随 NuGet 包发布或AnalyzerReleases.Unshipped.md本版本新增、尚未发布中否则会被RS2008等规则警告。Stride 的编译器服务工程 Stride.Core.CompilerServices.csproj 引用了Microsoft.CodeAnalysis.Analyzers包并开启EnforceExtendedAnalyzerRules因此完整保留了这套追踪文件。在 Stride 仓库中这两份台账位于 sources/core/Stride.Core.CompilerServices文件含义AnalyzerReleases.Shipped.md已随 Release 1.0 发布的规则 STRDIAG000 ~ STRDIAG010AnalyzerReleases.Unshipped.md本版本新引入、尚未发布的规则STRDIAG0111.1 已发布规则Release 1.0 的序列化诊断族Shipped.md记录了 Release 1.0 一次发布的 11 条规则全部归入Serialization类别严重级别均为 WarningRule IDCategorySeverityNotes分析器类名STRDIAG000SerializationWarningSTRDIAG000AttributeContradictionSTRDIAG001SerializationWarningSTRDIAG001InvalidDataContractSTRDIAG002SerializationWarningSTRDIAG002InvalidContentModeSTRDIAG003SerializationWarningSTRDIAG003InaccessibleMemberSTRDIAG004SerializationWarningSTRDIAG004PropertyWithNoGetterSTRDIAG005SerializationWarningSTRDIAG005ReadonlyMemberTypeIsNotSupportedSTRDIAG006SerializationWarningSTRDIAG006InvalidAssignModeSTRDIAG007SerializationWarningSTRDIAG007DataMemberOnDelegateSTRDIAG008SerializationWarningSTRDIAG008FixedFieldInStructsSTRDIAG009SerializationWarningSTRDIAG009InvalidDictionaryKeySTRDIAG010SerializationWarningSTRDIAG010InvalidConstructor这些分析器逐一对应 Analyzers 目录 中的STRDIAG000AttributeContradiction.cs至STRDIAG010InvalidConstructor.cs用于在编译期校验[DataContract]、[DataMember]等序列化标注的合法性保证引擎的 YAML 序列化模型在编译阶段即获得静态保障。1.2 未发布规则STRDIAG011 的登记信息AnalyzerReleases.Unshipped.md 的正文仅登记了一条新规则Rule ID | Category | Severity | Notes --------|----------|----------|------- STRDIAG011 | Build | Warning | STRDIAG011UndeclaredProjectAssetExtension关键变化在于两点一是类别从既有规则的Serialization切换为Build表明该规则服务于构建管线而非序列化模型二是它对应新的分析器 STRDIAG011UndeclaredProjectAssetExtension.cs。类别字符串定义于 Common/DiagnosticCategory.cs其中还包含统一的帮助文档链接格式https://doc.stride3d.net/latest/en/diagnostics/{0}.html。二、STRDIAG011 的职责拦截未声明的项目资源扩展名2.1 问题背景资源文件如何在构建时被静默丢弃Stride 的资源构建采用清单驱动模式MSBuild 在编译过程中生成一个.sdbuild清单AssetBuildManifest描述资产编译器需要从该项目收集哪些文件。生成逻辑位于 Stride.AssetBuildManifest.targets目标StrideWriteAssetBuildManifest遍历(Compile);(None);(AdditionalFiles)等候选项只有扩展名命中StrideProjectAssetExtensions属性列表的文件才会被写入清单的ProjectAssets段。因此如果开发者新定义了一种资源类型并为其标注了某个文件扩展名却忘记把该扩展名追加进StrideProjectAssetExtensions那么这些源文件不会被资产编译器捕获——资源会被静默丢弃且构建不报任何错误。STRDIAG011 正是为此设计的编译期防线。2.2 告警的完整输出形式分析器类 STRDIAG011UndeclaredProjectAssetExtension.cs 中定义了诊断 IDSTRDIAG011标题TitleProject-asset extension not declared in StrideProjectAssetExtensions消息格式MessageFormatAsset type {0} declares file extension {1}, which is missing from StrideProjectAssetExtensions. Append it in the projects build .targets so the asset compiler captures it into the .sdbuild manifest.类别Build默认启用严重级别 Warning即告警会明确指出资源类型{类型名}声明了文件扩展名{扩展名}但该扩展名未出现在StrideProjectAssetExtensions中开发者需要在项目的构建.targets里追加它才能让资源编译器将其纳入.sdbuild清单。2.3 检测逻辑的源码级拆解分析器以RegisterCompilationStartAction作为入口仅在满足以下条件时才启用见AnalyzeCompilationStart当前编译引用了Stride.Core.Assets能解析到IProjectAsset与AssetDescriptionAttribute否则说明这不是定义资源的工程直接静默返回编译器能读取到全局 MSBuild 属性build_property.StrideProjectAssetExtensionsForAnalyzer——拿不到该属性时分析器选择沉默而非猜测避免在非 Stride 构建环境中产生误报。随后通过RegisterSymbolAction(SymbolKind.NamedType)遍历每个类型按序过滤必须是非抽象类必须实现Stride.Core.Assets.IProjectAsset接口类型解析见 Common/WellKnownReferences.cs如果同时实现IProjectFileGeneratorAsset如可视化脚本这类设计期生成代码的资源其源文件本就不是资源构建输入直接跳过必须带有[AssetDescription]特性且第一个构造参数为文件扩展名字符串。对扩展名集合逐项校验时.cs会被专门排除——C# 源码编译进程序集永远不会由资产编译器从工程源文件构建。最终凡是既不在.cs豁免列表、也不在声明集合中的扩展名都会在类型声明处上报一条 STRDIAG011 警告。2.4 扩展名的归一化解析分析器内置的ParseExtensions方法统一了扩展名的书写规范按,或;分割、去空白、转小写、并自动补上缺失的前导点。例如开发者写sdsl、SDSL或.Sdsl都会被归一化为.sdsl参与比对从而与StrideProjectAssetExtensions中的声明保持一致避免大小写或格式差异造成的误报。三、StrideProjectAssetExtensions分析器与构建管线的数据桥梁3.1 扩展名列表的声明方式StrideProjectAssetExtensions是一个 MSBuild 属性由持有资源类型的层在 glob 文件的位置附近追加声明。仓库中有两处典型示例sources/sdk/Stride.Build.Sdk/Sdk/Sdk.targets#L162StrideProjectAssetExtensions$(StrideProjectAssetExtensions);.sdsl;.sdfx/StrideProjectAssetExtensions为着色器资源追加.sdslStride Shading Language与.sdfxEffect 组合文件sources/shaders/Stride.Shaders.Compilers/build/Stride.Shaders.Compilers.targets#L16以buildTransitive .targets方式追加同样的扩展名供插件消费方使用。自定义资源插件遵循同样的模式在自己工程随包分发的buildTransitive目标中追加$(StrideProjectAssetExtensions);.myext即可。3.2 分析器如何读到该属性由于editorconfig把;视为注释字符无法直接承载以分号分隔的 MSBuild 属性Stride.AssetBuildManifest.targets 中做了两件事通过CompilerVisibleProperty IncludeStrideProjectAssetExtensionsForAnalyzer /将该属性对 Roslyn 分析器可见在GenerateMSBuildEditorConfigFileCore之前执行_StrideExposeProjectAssetExtensions目标用$(StrideProjectAssetExtensions.Replace(;, ,))生成一份逗号分隔的副本注入分析器配置。分析器端则通过AnalyzerConfigOptionsProvider.GlobalOptions.TryGetValue(build_property.StrideProjectAssetExtensionsForAnalyzer, ...)读取——这正是 2.3 节中拿不到属性即沉默所对应的机制。同时清单写入目标还会通过GetStrideProjectAssetExtensions目标把ProjectReference引用的各工程扩展名并集进_StrideManifestExtensions确保跨工程引用时扩展名声明能够正确汇聚见 Stride.AssetBuildManifest.targets 与 清单写入目标。3.3 从告警到修复的完整闭环综合上述机制STRDIAG011 告警的生命周期可以概括为开发者实现IProjectAsset并用[AssetDescription(.xxx)]声明自定义资源类型编译时分析器读取StrideProjectAssetExtensionsForAnalyzer比对扩展名未命中则报告 STRDIAG011 警告提示扩展名缺失开发者在自己的buildTransitive .targets中追加$(StrideProjectAssetExtensions);.xxx重新构建后资产编译器将该扩展名文件写入.sdbuild清单的ProjectAssets资源不再被静默丢弃。四、实践指引何时触发、如何验证4.1 典型触发场景新增自定义资源类型但忘记同步StrideProjectAssetExtensions最常见资源类型声明了多个扩展名只声明了其中一个扩展名大小写或前导点书写不规范分析器会归一化比对StrideProjectAssetExtensions侧则以ToLowerInvariant统一处理见 清单写入逻辑。4.2 验证方式在定义资源类型的工程中执行dotnet build观察是否出现STRDIAG011警告及其消息中提示的扩展名检查obj/项目名.sdbuild清单文件确认目标扩展名是否已出现在ProjectAssets列表中若警告消失但清单中仍无该文件可检查候选项是否被ExcludeDirectory中间输出目录排除或是否带AutoGen元数据这两类文件本就不应进入清单。4.3 版本归属说明截至本仓库当前状态STRDIAG011 仍登记在AnalyzerReleases.Unshipped.md意味着它属于尚未随正式包发布的新规则开发者在本地源码构建中即可看到该告警而随包消费的用户要等其转入Shipped.md后才能获得。这也解释了为什么此前 STRDIAG000~010 全部属于 Serialization 类别——那是序列化诊断族的发布基线而 STRDIAG011 代表着分析器体系向Build 类别构建正确性的扩展。五、小结STRDIAG011 是 Stride 编译器服务中一条典型的构建期正确性分析器它把原本要等资源静默丢失后才能在运行期暴露的问题前移到编译期以明确警告呈现。通过 AnalyzerReleases.Unshipped.md 的登记、分析器实现 的静态检查以及 Stride.AssetBuildManifest.targets 与 Sdk.targets 的 MSBuild 联动三者共同构成了扩展名声明 → 清单捕获 → 资源编译的闭环保障。理解这条规则也就掌握了 Stride 资源构建管线的关键入口属性StrideProjectAssetExtensions及其分析器可见性传递机制。赞分享游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载相关推荐Buzz 本地音频转录工具完全指南离线语音转文字Buzz 本地音频转录工具完全指南离线语音转文字 Buzz 是一款在你个人电脑上本地运行音频转录的开源工具底层使用 OpenAI 的 Whisper 模型。人工智能语音音频本地部署桌面应用Emscripten编译警告趋势分析改进追踪与报告Emscripten编译警告趋势分析改进追踪与报告 在Emscripten开发过程中编译警告Warning往往是代码质量和潜在问题的早期信号。本文将从警编译器WebAssembly开发工具构建工具Humanizer 迁移分析器 HUMANIZER001从 v2 旧命名空间平滑升级到 v3 的 Roslyn 诊断规则全解析Humanizer 迁移分析器 HUMANIZER001从 v2 旧命名空间平滑升级到 v3 的 Roslyn 诊断规则全解析 Humanizer v3 将全开发工具上一篇如何实现音频淡入淡出效果APlayer音量控制高级技巧指南下一篇终极ComfyUI完全指南3步掌握AI创作的秘密武器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询