Roslyn 分析器缺少程序集警告
Roslyn analyzer missing assembly warning
创建针对 .Net Standard 2.0 的 Roslyn 分析器包后,当我在另一个项目中引用该包时,收到以下错误:
'C:\Users\username.nuget\packages\analyzer4.0.0.1\analyzers\dotnet\cs\Analyzer4.dll' 依赖于 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 但没有找到。分析器可能无法 运行 正确,除非将缺少的程序集也添加为分析器参考。
使用分析器的项目重现是 here。此重现是一个普通的 .Net Core 2.0 控制台应用程序,其中包含对分析器的引用,没有任何其他代码。分析器本身是通过在 Visual Studio 中创建默认 Analyzer 项目,对其进行更改,使其以 netstandard2.0 而不是 netstandard1.3 为目标,然后在发布模式下构建以生成 .nupkg 文件来构建的。正如重现所演示的那样,分析器确实可以正常工作,但会生成警告。
Github 上的各个地方都有关于此警告的讨论,例如 here,但在那些情况下,分析器作者故意删除了一些本地库代码。在这种情况下,分析器不引用任何其他库。
我不清楚将分析器添加为 "analyzer reference" 而不仅仅是常规项目参考究竟意味着什么。我试过改变
<PackageReference Include="Analyzer4" Version="1.0.0.1" />
到
<Analyzer Include="..\LocalPackages\Analyzer4.1.0.0.1.nupkg" />
但这导致了另一条错误消息(“PE 图像不包含托管元数据”)。
任何人都可以解释这个错误的含义以及理想的修复方法吗?
这个问题的一些背景是here。当分析器依赖于另一个程序集时,两者都必须列为分析器,但核心系统程序集通常是一个例外。不幸的是,.Net standard 2.0 似乎还没有被添加到例外列表中;据推测,这将在未来的某个时候发生。我能够更改代码以将分析器定位到 .Net Standard 1.3,从而避免警告。
将其他程序集(例如Newtonsoft.Json)添加到您的分析器时也会出现此问题。解决这个问题的一种方法就是不这样做。例如,StyleCop 消除了对 Newtonsoft.Json 的依赖,并直接在其程序集中包含 LightJson 的代码。其他解决方案可能是 (1) 手动将您依赖的 dll 复制到 .nupkg 文件中(如有必要,将其从您的包文件夹中取出),认识到 .nupkg 实际上只是一个 .zip 文件;或 (2) 使用像 ILMerge 这样的工具将依赖项合并到您的 DLL 中。我还没有尝试过这些方法,所以如果其他人可以逐步解释如何将其集成到分析器的构建中,我会将其标记为正确答案。
您可以使用 Source Generators Cookbook 中的方法(感谢@mbabramo 提供 link!)。
<ItemGroup>
<PackageReference Include="Analyzer4" Version="1.0.0.1" />
</ItemGroup>
变成:
<ItemGroup>
<PackageReference Include="Analyzer4" Version="1.0.0.1" PrivateAssets="all" GeneratePathProperty="true" />
<None Include="$(PkgAnalyzer4)\lib\netstandard2.0\*.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
这应该会将包 dll 添加到分析器的文件夹中,它应该可以工作。
创建针对 .Net Standard 2.0 的 Roslyn 分析器包后,当我在另一个项目中引用该包时,收到以下错误:
'C:\Users\username.nuget\packages\analyzer4.0.0.1\analyzers\dotnet\cs\Analyzer4.dll' 依赖于 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 但没有找到。分析器可能无法 运行 正确,除非将缺少的程序集也添加为分析器参考。
使用分析器的项目重现是 here。此重现是一个普通的 .Net Core 2.0 控制台应用程序,其中包含对分析器的引用,没有任何其他代码。分析器本身是通过在 Visual Studio 中创建默认 Analyzer 项目,对其进行更改,使其以 netstandard2.0 而不是 netstandard1.3 为目标,然后在发布模式下构建以生成 .nupkg 文件来构建的。正如重现所演示的那样,分析器确实可以正常工作,但会生成警告。
Github 上的各个地方都有关于此警告的讨论,例如 here,但在那些情况下,分析器作者故意删除了一些本地库代码。在这种情况下,分析器不引用任何其他库。
我不清楚将分析器添加为 "analyzer reference" 而不仅仅是常规项目参考究竟意味着什么。我试过改变
<PackageReference Include="Analyzer4" Version="1.0.0.1" />
到
<Analyzer Include="..\LocalPackages\Analyzer4.1.0.0.1.nupkg" />
但这导致了另一条错误消息(“PE 图像不包含托管元数据”)。
任何人都可以解释这个错误的含义以及理想的修复方法吗?
这个问题的一些背景是here。当分析器依赖于另一个程序集时,两者都必须列为分析器,但核心系统程序集通常是一个例外。不幸的是,.Net standard 2.0 似乎还没有被添加到例外列表中;据推测,这将在未来的某个时候发生。我能够更改代码以将分析器定位到 .Net Standard 1.3,从而避免警告。
将其他程序集(例如Newtonsoft.Json)添加到您的分析器时也会出现此问题。解决这个问题的一种方法就是不这样做。例如,StyleCop 消除了对 Newtonsoft.Json 的依赖,并直接在其程序集中包含 LightJson 的代码。其他解决方案可能是 (1) 手动将您依赖的 dll 复制到 .nupkg 文件中(如有必要,将其从您的包文件夹中取出),认识到 .nupkg 实际上只是一个 .zip 文件;或 (2) 使用像 ILMerge 这样的工具将依赖项合并到您的 DLL 中。我还没有尝试过这些方法,所以如果其他人可以逐步解释如何将其集成到分析器的构建中,我会将其标记为正确答案。
您可以使用 Source Generators Cookbook 中的方法(感谢@mbabramo 提供 link!)。
<ItemGroup>
<PackageReference Include="Analyzer4" Version="1.0.0.1" />
</ItemGroup>
变成:
<ItemGroup>
<PackageReference Include="Analyzer4" Version="1.0.0.1" PrivateAssets="all" GeneratePathProperty="true" />
<None Include="$(PkgAnalyzer4)\lib\netstandard2.0\*.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
这应该会将包 dll 添加到分析器的文件夹中,它应该可以工作。