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

11

我制作了一个C# 9源代码生成器,你可以在这里找到它。

当我将整个项目作为另一个解决方案中的引用来使用时,它可以正常工作。但是当我使用当前配置将其上传到Nuget (这里)时,它就无法工作了。

如何正确配置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>

它不工作是什么意思? - Yair Halberstadt
编译器找不到MockableStaticAttribute。当我使用它时出现错误[MockableStatic(typeof(Dapper.DynamicParameter))] public class Sample {}。 - HamedFathi
1
如果您解压NuGet包,您会发现该包存储在lib目录中。它必须存储在analyzers目录中。 - Yair Halberstadt
2个回答

22

如果您解压缩nuget包,您会发现该包存储在lib目录中。它必须存储在analyzers目录中。

一种方法是将以下内容添加到您的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>

3

Yair的回答已经很详细了,我想添加一个希望有用的调试技巧。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接