我正在发布一个 ASP.NET Core MVC 3.0 网站,并且输出文件夹包含许多对库的多种语言的引用Microsoft.CodeAnalysis
,有人知道为什么吗?
当然,FxCopAnalyzers
Nuget 包安装在项目上,但它没有在项目的早期版本中发布,所以我不明白为什么现在是它,因为它应该只在开发时有用,而不是在生产环境中。
我正在发布一个 ASP.NET Core MVC 3.0 网站,并且输出文件夹包含许多对库的多种语言的引用Microsoft.CodeAnalysis
,有人知道为什么吗?
当然,FxCopAnalyzers
Nuget 包安装在项目上,但它没有在项目的早期版本中发布,所以我不明白为什么现在是它,因为它应该只在开发时有用,而不是在生产环境中。
对我来说,*.csproj
文件中的这一行以某种方式解决了这个问题。它仍然部署Microsoft.CodeAnalysis
,但仅用于en
:
<PropertyGroup>
<!-- ... -->
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
请参阅关于 Github 问题的评论(由 Jonathon Marolf 撰写)。
这是我试图使解决方案更容易看到的看法。
问题很可能是使用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
库仅在调试模式下编译时才会出现。所以现在,当您使用发布模式发布时,它们将不会成为输出的一部分。
就我而言,问题是“Microsoft.VisualStudio.Web.CodeGeneration.Design”。我需要将“.csproj”文件中的包引用更改为包括ExcludeAssets="all"
:
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
包含许多对 Microsoft.CodeAnalysis 库的多种语言的参考
我在使用 3.0 版本时确实遇到了同样的问题。但我不认为这是由 .net core 3 编译发布视图引起的,因为分支中还有View ViewCompilationrelease/2.1
。
它应该只在开发时有用,而不是在生产环境中。
我相信你是对的。这些分析应仅在开发时使用。
但是当我手动卸载SDK(3.0) 并再次安装最新的 SDK 时,我不能再重现了。我不知道为什么会这样,也许它现在已经修复了。它更有可能是由另一个原因引起的:我在其他依赖于 Microsoft.CodeAnalysis的包上添加了一个额外的参考)。无论如何,请先将您的 SDK 升级到最新版本。
另一个重要的事情是,当使用 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:
我不使用 Razor Compilation,但仍然遇到同样的问题。我结合了这里的答案来解决它。在 中csproj
,我首先添加了这个:
<PropertyGroup>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
并将实际项目更改为:
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.4"
Condition="'$(Configuration)' == 'Debug'" />