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

piok6c0g  于 2023-03-24  发布在  .NET
关注(0)|答案(3)|浏览(165)

当我发布一个ASP.NET Core 3.0项目时,我会得到一些本地化的文件夹,其中显示的4个程序集都在这些文件夹中。我不确定为什么会包含这些文件夹和文件。我的包都没有引用CodeAnalysis包。
我在csproj文件中添加了<PreserveCompilationContext>false</PreserveCompilationContext>,但没有帮助。有没有办法排除它们?

ubof19bj

ubof19bj1#

添加以下内容:

<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>

适用于VS 2019和其他版本

更新2021/2022:

仍在使用Visual Studio 2022和.NET 6

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

mu0hgdu02#

如果您有一个对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>
xqnpmsa8

xqnpmsa83#

在我的例子中,这些本地化文件夹的源代码来自Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包。它依赖于Microsoft.CodeAnalysis.Razor。您可以在此处阅读有关该包用途的更多信息:https://learn.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问题来描述这个确切的场景,但不幸的是它从未得到解决。

相关问题