提问人:Dani 提问时间:10/14/2023 更新时间:10/16/2023 访问量:75
C# 源代码生成 - IIncrementalGenerator - 未触发
C# source generation - IIncrementalGenerator - not triggered
问:
我有我的源生成器项目文件:
<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 引用源生成器。
我需要更改哪些内容,而不需要引用源生成器本身?
答:
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>
评论