Answers:
包含许多以多种语言引用的Microsoft.CodeAnalysis库
我在使用3.0版本时确实遇到了相同的问题。但是我不认为这是由.net core 3编译发布视图引起的,因为在分支中也有ViewViewCompilationrelease/2.1
。
它仅在开发时有用,而不在生产环境中有用。
我相信你是对的。这些分析只能在devtime上使用。
但是,当我手动卸载 SDK(3.0)并再次安装最新的SDK时,我无法再复制了。我不知道为什么会发生这种情况,也许现在已经解决了。这很可能是由另一个原因引起的:我在偶然依赖Microsoft.CodeAnalysis的其他软件包上添加了额外的参考。无论如何,请先将您的SDK升级到最新版本。
另一个重要的事情是,当使用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 │└───... ├───包装/ │└────... └───_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:
dotnet aspnet-codegenerator controlller ...
对我来说,*.csproj
文件中的这一行以某种方式解决了该问题。仍会部署Microsoft.CodeAnalysis
,但仅用于en
:
<PropertyGroup>
<!-- ... -->
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
请参阅有关Github问题的评论(乔纳森·马洛夫(Jonathon Marolf))。
这是我的尝试,以使解决方案更易于查看。
问题很可能是使用AddRazorRuntimeCompilation()
。更具体地说,在startup.cs中,您可能会添加razor运行时编译,如下所示:
IMvcBuilder builder = services.AddControllersWithViews()
.AddRazorRuntimeCompilation();
为了支持这一点,您的Web项目可能参考了 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
那个nuget包依赖Microsoft.CodeAnalysis
于在publish文件夹中产生所有不需要的输出。
解决方法是编辑项目文件,并使依赖项在Debug模式下成为条件,如下所示:
<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
库仅在调试模式下编译时才可用。因此,现在当您使用发布模式发布时,它们将不会成为输出的一部分。