如何打包 C# 9 源代码生成器并将其上传到 Nuget?

How to pack a C# 9 source generator and upload it to the Nuget?

我做了一个C#9源代码生成器,你可以找到它here

当我在另一个解决方案中使用整个项目并将其作为项目引用时,它可以正常工作,但是当我将其与当前配置一起上传到 Nuget (here) 时,它不起作用。

如何正确配置 C# 9 源代码生成器以作为 Nuget 包工作?我的项目有什么问题?

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Version>0.0.2</Version>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
    <PackageTags>dotnet</PackageTags>
    <PublishRepositoryUrl>true</PublishRepositoryUrl>
    <GenerateRepositoryUrlAttribute>true</GenerateRepositoryUrlAttribute>
    <PackBuildOutput>true</PackBuildOutput>
    <PackageId>MockableStaticGenerator</PackageId>
    <PackOnBuild>true</PackOnBuild>
    <PackFolder>analyzers\cs</PackFolder>
    <DebugType>embedded</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>
  <PropertyGroup>
    <RestoreAdditionalProjectSources>https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json ;$(RestoreAdditionalProjectSources)</RestoreAdditionalProjectSources>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.1">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>
</Project>

如果解压 nuget 包,您会看到该包存储在 lib 目录中。它必须存储在分析器目录中。

一种方法是将以下内容添加到您的 csproj:

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

如果你是多目标,它应该是:

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

这将包括您的项目作为库和分析器。

要将其用作分析器,请添加以下内容:

<PropertyGroup>
  <IncludeBuildOutput>false</IncludeBuildOutput>
</PropertyGroup>

Yair 的回答很好地涵盖了这一点。我想添加一个调试提示,希望对您有所帮助。

如果您使用 SDK 样式的项目来指定您的包,那么在打包后您可以在 obj 文件夹中找到生成的 .nuspec 文件。查看该文件的内容对于了解包裹的消费者实际可以使用的内容非常有帮助。