为什么 Microsoft.CodeAnalysis 与 ASP.NET 核心网站一起发布?

Why is Microsoft.CodeAnalysis published with ASP.NET Core website?

我正在发布一个 ASP.NET Core MVC 3.0 网站,输出文件夹包含许多对 Microsoft.CodeAnalysis 库的多种语言的引用,有人知道为什么吗?

项目中当然安装了FxCopAnalyzersNuget包,但在项目的早期版本中并没有发布,所以我不明白为什么现在是,因为它应该只是有用的在开发时而不是在生产环境中。

contains lots of reference in many language to Microsoft.CodeAnalysis librairies

我在使用3.0版本的时候确实遇到了同样的问题。但我不认为这是由 .net core 3 对发布的编译视图造成的,因为 release/2.1 分支中也有 View ViewCompilation .


it should be useful only at dev time not in a production environnement.

  1. 我相信你是对的。这些分析应仅在开发时使用。

  2. 但是当我手动卸载SDK(3.0)并再次安装最新的SDK时,我不能'不再重现。我不明白为什么会这样,也许现在已经修复了。这更有可能是由另一个原因引起的:我 在其他依赖于 Microsoft.CodeAnalysis 的包上添加了一个额外的参考)。不管怎样,请先将您的SDK升级到最新版本。

  3. 另外一个重要的是,当使用Visual Studio添加控制器时,它会自动添加对Microsoft.VisualStudio.Web.CodeGeneration.Design的引用。 请注意,此包间接依赖于 Microsoft.CodeAnalysis.Common 包。这里的 Microsoft.CodeAnalysis.Common 是 Microsoft .NET 编译器平台 ("Roslyn") 使用的共享包。如果你下载这个包并手动解压这个库,你会发现有一个 Microsoft.CodeAnalysis.dll :

    microsoft.codeanalysis.common.3.3.1/
    ├───lib/
    │   └───netstandard2.0/
    │       ├─── ...
    │       ├─── Microsoft.CodeAnalysis.dll
    │       ├─── Microsoft.CodeAnalysis.pdb
    │       ├─── Microsoft.CodeAnalysis.xml
    │       └─── ...
    ├───package/
    │   └───...
    └───_rels/
    

    这个包只在开发时需要。如果不删除此依赖项,您将在发布文件夹中获得大量与 Microsoft.CodeAnalysis 相关的 dll。

    <ItemGroup>
        <!-- this is not necessary when publishing -->
        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
    </ItemGroup>
    

    删除那些依赖Microsoft.CodeAnalysis的包,然后你应该不会得到Microsoft.CodeAnalysis相关的dlls:

以下是我试图使解决方案更容易理解的看法。

问题很可能是使用 AddRazorRuntimeCompilation()。更具体地说,在 startup.cs 中,您可能会像这样添加 razor 运行时编译:

IMvcBuilder builder = services.AddControllersWithViews()
                     .AddRazorRuntimeCompilation(); 

为了支持这一点,您的 Web 项目可能引用了 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

那个 NuGet 包依赖于 Microsoft.CodeAnalysis,它会在发布文件夹中产生所有不需要的输出。

修复方法是编辑项目文件并在调试模式下设置依赖条件,如下所示:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" 
Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
</ItemGroup>

然后在 startup.cs 文件中,有条件地调用 AddRazorRuntimeCompilation(),如下所示:

IMvcBuilder builder = services.AddControllersWithViews();

#if DEBUG
if (Env.IsDevelopment()) {
    builder.AddRazorRuntimeCompilation();
}
#endif

这将导致所有这些 Microsoft.CodeAnalysis 库仅在调试模式下编译时出现。所以现在,当您使用 Release 模式发布时,它们将不会成为输出的一部分。

对我来说,*.csproj 文件中的这一行以某种方式解决了这个问题。它仍然部署 Microsoft.CodeAnalysis,但仅针对 en:

<PropertyGroup>
  <!-- ... -->
  <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

请参阅 the comment(作者:Jonathon Marolf)关于 Github 的问题。

在我的例子中,问题是“Microsoft.VisualStudio.Web.CodeGeneration.Design”。我需要更改“.csproj”文件中的包引用以包含 ExcludeAssets="all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />

我没有使用 Razor Compilation,但仍然遇到同样的问题。我结合了这里的答案来解决它。对于csproj,我首先添加了这个:

<PropertyGroup>
    <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

并将实际项目更改为:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.4" 
    Condition="'$(Configuration)' == 'Debug'" />