如何阻止本地化的 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>
当我发布一个 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>