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

Jon*_*han 18 fxcop asp.net-core microsoft.codeanalysis

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

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

mrm*_*wji 22

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

<PropertyGroup>
  <!-- ... -->
  <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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


Ron*_*n C 13

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

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

IMvcBuilder builder = services.AddControllersWithViews()
                     .AddRazorRuntimeCompilation(); 
Run Code Online (Sandbox Code Playgroud)

为了支持这一点,您的 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>
Run Code Online (Sandbox Code Playgroud)

然后在 startup.cs 文件中,AddRazorRuntimeCompilation()像这样有条件地调用:

IMvcBuilder builder = services.AddControllersWithViews();

#if DEBUG
if (Env.IsDevelopment()) {
    builder.AddRazorRuntimeCompilation();
}
#endif
Run Code Online (Sandbox Code Playgroud)

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

  • IWebHostEnvironment(上例中的 Env)在ConfigureServices() 中并不容易获得,但您可以很容易地显示它。/sf/ask/2636203041/ (2认同)

Edu*_*ira 7

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

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Run Code Online (Sandbox Code Playgroud)

  • 像往常一样 - 最佳答案是最后一个 (2认同)

itm*_*nus 6

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

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


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

  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/
    ????库/
    ? ????netstandard2.0/
    ? ???...
    ? ???微软代码分析文件
    ? ???Microsoft.CodeAnalysis.pdb
    ? ???微软代码分析.xml
    ? ???...
    ????包裹/
    ? ????...
    ????_rels/
    

    这个包只在开发时需要。如果你不删除这个依赖,你会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然后你应该不会得到Microsoft.CodeAnalysis相关的 dll:

    在此处输入图片说明