Version: 6000.3
语言: 中文
安装和使用现有分析仪或源生成器
创建规则集文件

Roslyn 分析器和源生成器的其他文件

可以向项目添加其他文件,供 Roslyn 分析器或源生成器使用。如果文件扩展名为 .additional文件,并且位于Assets文件夹或其子文件夹之一。

命名其他文件

要传递到编译管道,必须根据格式命名文件Filename.[Analyzer Name].additionalfile.缺少[Analyzer Name]组件被导入,但未传递到编译管道。这[Analyzer Name]组件区分大小写,并且必须与其他文件目标的分析器名称匹配。这Filename组件不得包含句点 (.) 字符。

其他文件过滤

每个编译的程序集都会根据为该程序集定义运行的分析器接收一个附加文件列表,并按[Analyzer Name].例如,考虑一个具有以下程序集和分析器的项目:

  • Assembly1 使用名为Analyzer1
  • Assembly2 使用名为Analyzer2
  • Assembly3 同时使用Analyzer1Analyzer2

如果项目包含四个名为FileA.Analyzer1.additionalfile,FileB.Analyzer2.additionalfile,FileC.additionalfileFileD.Analyzer3.additionalfile,则 Unity 将传递以下附加文件列表以及相应的程序集:

  • 组装1:FileA.Analyzer1.additionalfile
  • 组装2:FileB.Analyzer2.additionalfile
  • 组装3:FileA.Analyzer1.additionalfile,FileB.Analyzer2.additionalfile

因为FileC没有[Analyzer Name]组件和FileD引用项目中不存在的分析器,Unity 不会将任何一个分析器传递给编译管道。

从代码中检索可用的附加文件

分析器可以从分析器上下文中检索已编译程序集中包含的其他文件的完整列表。此列表包含程序集中包含的所有附加文件,而不仅仅是与当前分析器名称匹配的文件。以下示例演示了这一点:

using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace SourceGeneratorTest1;


[Generator]
public class SG2 : ISourceGenerator
{
    public void Execute(GeneratorExecutionContext context)
    {
        var pathOfFileWithTypeName = context.AdditionalFiles.FirstOrDefault(file => file.Path.Contains("GenerateType.SourceGenerator.Test.2.additionalfile"));
        if (pathOfFileWithTypeName == null)
        {
            // no additional file found, do not generate a type.
            return;
        }

        var @namespace = context.Compilation.SyntaxTrees.First().GetRoot().DescendantNodes().OfType<NamespaceDeclarationSyntax>().FirstOrDefault()?.Name?.ToString() ?? "NoNamespace";

        // an additional file has been passed; read the type name from the file.
        string generatedTypeName = File.ReadAllText(pathOfFileWithTypeName.Path);

        context.AddSource(
            "SG2.generated.cs", 
            $$"""
            namespace {{@namespace}}
            {
                public partial class {{generatedTypeName}}
                {
                }
            }
            """);
    }

    public void Initialize(GeneratorInitializationContext context)
    {
    }
}

注意:此示例仅用于演示如何使用分析器上下文检查其他文件。生产就绪的源生成器需要更全面的代码来处理错误并确保正确的功能和性能。

在前面的筛选示例中,Analyzer1Analyzer2都可以检索以其中任何一个命名的 Assembly3 的其他文件。每个分析器负责检查附加文件中是否有可以使用的任何数据。

还可以使用编辑器代码中的 ScriptCompilerOptions.RoslynAdditionalFilePaths 属性检索给定程序集包含的其他文件列表。

其他资源

安装和使用现有分析仪或源生成器
创建规则集文件