能否在Roslyn Analyzer中访问appsettings.json配置文件?
需求实现可行性结论
该需求完全可以实现,你遇到的RegisterAdditionalFileAction无法匹配appsettings*.json文件的问题,属于项目配置或分析器逻辑的常见疏漏,以下是完整排查和实现方案:
匹配失败常见原因
- 首先确认
appsettings*.json的生成操作属性配置错误:默认添加到项目的json文件生成操作是Content,不会被分析器识别为附加文件,需要手动修改文件属性的「生成操作」为「C# 分析器附加文件」,或者在csproj中添加如下配置:
<ItemGroup> <AdditionalFiles Include="appsettings.json" /> <AdditionalFiles Include="appsettings.*.json" /> </ItemGroup>
- 其次确认分析器逻辑没有做文件名过滤:
RegisterAdditionalFileAction本身不会按后缀筛选文件,所有标记为附加文件的内容都会触发回调,你需要在回调逻辑中自行匹配文件名规则,不能依赖注册阶段自动过滤。
完整实现示例
[DiagnosticAnalyzer(LanguageNames.CSharp)] public class AppsettingsRuleAnalyzer : DiagnosticAnalyzer { // 诊断规则定义(根据自己的校验规则修改ID、提示信息等参数) public static readonly DiagnosticDescriptor InvalidConfigRule = new DiagnosticDescriptor( id: "CFG001", title: "appsettings配置不合规", messageFormat: "配置项{0}不符合规范:{1}", category: "ConfigurationCheck", defaultSeverity: DiagnosticSeverity.Warning, isEnabledByDefault: true); public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(InvalidConfigRule); public override void Initialize(AnalysisContext context) { context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); context.EnableConcurrentExecution(); // 注册附加文件处理回调 context.RegisterAdditionalFileAction(AnalyzeConfigFile); } private void AnalyzeConfigFile(AdditionalFileAnalysisContext context) { var fileName = Path.GetFileName(context.AdditionalFile.Path); // 过滤非appsettings前缀的json文件 if (!fileName.StartsWith("appsettings", StringComparison.OrdinalIgnoreCase) || !fileName.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) { return; } // 读取文件内容 var fileText = context.AdditionalFile.GetText(context.CancellationToken); if (fileText == null) return; try { // 此处替换为你自己的json校验逻辑,比如解析后校验特定节点的取值 var jsonRoot = JsonDocument.Parse(fileText.ToString()).RootElement; // 示例:校验是否存在必填的ConnectionStrings节点 if (!jsonRoot.TryGetProperty("ConnectionStrings", out _)) { var diagnostic = Diagnostic.Create(InvalidConfigRule, Location.None, "ConnectionStrings", "缺少必填的数据库连接配置节点"); context.ReportDiagnostic(diagnostic); } } catch (JsonException) { // 可按需上报json格式错误的诊断 } } }
注意事项
- 如果你使用SDK风格的项目,可以把附加文件配置写到
Directory.Build.props中,统一作用于整个解决方案下的所有项目,不需要每个项目单独配置 - 解析json时建议增加容错逻辑,避免用户输入的json格式不合法时导致分析器运行异常
- 上报诊断时可以通过解析json的行号信息,把诊断位置关联到json文件的对应行,方便用户快速定位问题
内容的提问来源于stack exchange,提问作者Steve Wilford
相关产品推荐
相关产品推荐

