20

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

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

4

5 回答 5

23

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

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

请参阅关于 Github 问题的评论(由 Jonathon Marolf 撰写)。

于 2020-01-12T10:55:55.553 回答
14

这是我试图使解决方案更容易看到的看法。

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

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

为了支持这一点,您的网络项目可能参考了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库仅在调试模式下编译时才会出现。所以现在,当您使用发布模式发布时,它们将不会成为输出的一部分。

于 2020-01-06T20:11:07.417 回答
9

就我而言,问题是“Microsoft.VisualStudio.Web.CodeGeneration.Design”。我需要将“.csproj”文件中的包引用更改为包括ExcludeAssets="all"

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
于 2020-03-11T18:51:58.620 回答
7

包含许多对 Microsoft.CodeAnalysis 库的多种语言的参考

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


它应该只在开发时有用,而不是在生产环境中。

  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”)使用的共享包。如果你下载这个包并手动解压这个lib,你会发现有一个Microsoft.CodeAnalysis.dll

    microsoft.codeanalysis.common.3.3.1/
    ├───lib/
    │ └───netstandard2.0/
    │ ├─── ...
    │ ├─── Microsoft.CodeAnalysis.dll
    │ ├─── Microsoft.CodeAnalysis.pdb
    │ ├─── Microsoft.CodeAnalysis.xml
    │ └─── ...
    ├────包装/
    │ └───...
    └────_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相关的 dll:

    在此处输入图像描述

于 2019-10-09T06:57:31.743 回答
2

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

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

并将实际项目更改为:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.4" 
    Condition="'$(Configuration)' == 'Debug'" />
于 2020-08-07T09:58:39.653 回答