C# 源代码生成 - IIncrementalGenerator - 未触发

C# source generation - IIncrementalGenerator - not triggered

提问人:Dani 提问时间:10/14/2023 更新时间:10/16/2023 访问量:75

问:

我有我的源生成器项目文件:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <AnalyzerRoslynVersion>4.4</AnalyzerRoslynVersion>
        <TargetFramework>netstandard2.0</TargetFramework>
        <Nullable>enable</Nullable>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
        <CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
        <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
        <IsRoslynComponent>true</IsRoslynComponent>
        <LangVersion>latest</LangVersion>
        <ImplicitUsings>enable</ImplicitUsings>
        <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.7.0" PrivateAssets="all" />
        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" />
    </ItemGroup>

    <ItemGroup>
        <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>

</Project>

在程序集 Domain.Core 中,我定义了标记属性。

[AttributeUsage(AttributeTargets.Class)]
public class EventApplyAttribute : Attribute
{
    public string FullyQualifiedAggregateName { get; }

    public EventApplyAttribute(string fullyQualifiedAggregateName)
    {
        FullyQualifiedAggregateName = fullyQualifiedAggregateName;
    }
}

Domain.Core 项目引用源生成器项目。

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net7.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Jaeger" Version="1.0.3" />
        <PackageReference Include="OpenTracing.Contrib.NetCore" Version="0.9.0" />
        <PackageReference Include="Scrutor" Version="4.2.0" />
    </ItemGroup>

    <ItemGroup>
      <ProjectReference Include="..\SourceGenerator.csproj" ReferenceOutputAssembly="false" PackAsAnalyzer="true" />
    </ItemGroup>
</Project>

这些项目打包为 nuget 包。

在我的代码中,我使用了标记属性:

[EventApply("SampleAggregate.Sample")]
public class SampleAdded : DomainEvent

如果我引用这两个包:

<ItemGroup>
    <PackageReference Include="Domain.Core" Version="3.0.43-beta" />
    <PackageReference Include="SourceGenerator" Version="3.0.43-beta" />
</ItemGroup>

它工作正常。但我希望我只需要引用 Domain.Core,因为 Domain.Core 引用源生成器。

我需要更改哪些内容,而不需要引用源生成器本身?

C# c夏普源生成器

评论


答:

0赞 Dani 10/16/2023 #1

我没有发现项目参考的可能性。但它适用于包引用。在这里,它需要创建 nuget 包。

源生成器 csproj:

<Project Sdk="Microsoft.NET.Sdk">
    
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
        <IncludeBuildOutput>false</IncludeBuildOutput>
        <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
        <CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
        <IsRoslynComponent>true</IsRoslynComponent>
        <LangVersion>latest</LangVersion>
    </PropertyGroup>
    
    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.7.0" PrivateAssets="all" />
        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" />
    </ItemGroup>
    
    <ItemGroup>
        <None Remove="bin\Debug\netstandard2.0\\SourceGenerator.dll" />
        <None Remove="bin\Release\netstandard2.0\\SourceGenerator.dll" />
    </ItemGroup>
    
    <ItemGroup>
        <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>

</Project>

使用 csproj(nuget 包):

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Jaeger" Version="1.0.3" />
        <PackageReference Include="OpenTracing.Contrib.NetCore" Version="0.9.0" />
        <PackageReference Include="Scrutor" Version="4.2.0" />
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\SourceGenerator\SourceGenerator.csproj" Pack="false">
            <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
            <OutputItemType>Content</OutputItemType>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </ProjectReference>
    </ItemGroup>

    <ItemGroup>
        <!-- Package the generator in the analyzer directory of the nuget package -->
        <None Remove="$(OutputPath)/SourceGenerator.dll" />
        <None Include="$(OutputPath)/SourceGenerator.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>
    
</Project>