如何阻止本地化的 Microsoft.CodeAnalysis.*.resources.dll 文件被 ASP.NET Core 发布?

How to stop the localized Microsoft.CodeAnalysis.*.resources.dll files from getting published by ASP.NET Core?

当我发布一个 ASP.NET Core 3.0 项目时,我得到了几个本地化文件夹,其中显示的 4 个程序集位于每个文件夹中。我不确定为什么包含这些文件夹和文件。我的 None 个包裹引用了 CodeAnalysis 个包裹。

我在 csproj 文件中添加了 <PreserveCompilationContext>false</PreserveCompilationContext> 但它没有帮助。有没有办法排除它们?

如果您有对 Microsoft.VisualStudio.Web.CodeGeneration.Design 的项目引用,那么您在发布的输出中会得到很多包含 CodeAnalysis.dll 文件的语言文件夹,这是脚手架控制器所需要的。如果您的项目是这样,请更改 .csproj 文件中的包引用以包含 ExcludeAssets="all"

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

例如,旧*.csproj文件

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UserSecretsId>aspnet-foo-4E53EF45-B3BE-4943-81BE-2449DC5AA2BC</UserSecretsId>
    <BlazorLinkOnBuild>false</BlazorLinkOnBuild>
  </PropertyGroup>
  
  <ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design"
                      Version="3.0.0" />
  </ItemGroup>
  
  <ItemGroup>
    <!-- ... -->
  </ItemGroup>
</Project>

新文件 *.csproj 应该是

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UserSecretsId>aspnet-foo-4E53EF45-B3BE-4943-81BE-2449DC5AA2BC</UserSecretsId>
    <BlazorLinkOnBuild>false</BlazorLinkOnBuild>
  </PropertyGroup>
  
  <ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design"
                      Version="3.0.0"
                      ExcludeAssets="All" />
  </ItemGroup>
  
  <ItemGroup>
    <!-- ... -->
  </ItemGroup>
</Project>

就我而言,这些本地化文件夹的来源来自包 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation。它依赖于 Microsoft.CodeAnalysis.Razor。您可以在此处详细了解该软件包的用途:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.1

您不能在尝试利用该包时只排除资产。我的解决方法是在项目处于调试模式时有条件地包含包引用。

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

然后我使用 #if 预处理器指令有条件地 运行 启用 razor 运行 时间编译的代码。

#if DEBUG
            services.AddRazorPages().AddRazorRuntimeCompilation();
#else
            services.AddRazorPages();
#endif

请注意:您可能需要删除您的 bin 文件夹才能看到构建后删除的文件夹。此外,请确保您在正确的解决方案配置下构建。

我能够找到一个 Github 问题来描述这个确切的场景,但遗憾的是它从未得到解决。 https://github.com/dotnet/extensions/issues/2247

添加这个:

<SatelliteResourceLanguages>en</SatelliteResourceLanguages>

.csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
  </PropertyGroup>

按照建议,您可以使用none来排除所有这些:

<SatelliteResourceLanguages>none</SatelliteResourceLanguages>

并考虑您想要的语言,例如英语和西班牙语:

<SatelliteResourceLanguages>en;es</SatelliteResourceLanguages>

适用于 VS2019 和其他版本

2021/2022 更新:

仍在使用 Visual Studio 2022 和 .NET 6

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>