在使用 dotnet publish 或 Visual Studio 发布 ASP.NET Core 网站时,常会看到发布输出目录中包含许多类似 af, ar, az, bg 的语言代码文件夹。它们究竟是什么?能否减少?本文深入解读这些文件夹的作用,并分享优化技巧。
这些语言文件夹的来源和作用
这些命名为语言代码(如 af=南非荷兰语、ar=阿拉伯语、az=阿塞拜疆语、bg=保加利亚语)的文件夹,其实是 .NET 应用自动生成的 卫星资源程序集(satellite assemblies)。它们由 NuGet 包中提供的 локализация(本地化)资源组成,为不同文化环境提供翻译或区域化字符串。发布时 MSBuild 默认会将这些资源复制到输出目录,以便运行时根据客户端文化加载对应语言资源。
每个语言文件夹中通常含有 .resources.dll,用于支持该语言环境的 UI 文本、本地化错误消息等。当应用使用或引用了支持多语言的库(如 CodeAnalysis、Entity Framework 或 scaffolding 包)时,这些资源会被自动带入发布目录。
为什么即使不使用多语言也会包含这些文件
即使你的项目并未主动启用国际化功能,只要引用了含本地化资源的 NuGet 包,MSBuild 默认行为仍会生成所有可用语言的卫星资源。这是 .NET 默认的国际化体系,旨在最大化库的适用性,但如果你只部署英文版本则显得冗余。
另外,如果你启用了 Razor 运行时编译或 scaffolding 生成支持,也可能触发本地化资源复制机制,从而生成上述语言文件夹。
如何减少这些语言文件和文件夹
方案一:使用 SatelliteResourceLanguages 属性过滤语言资源
在项目 .csproj 文件中添加如下配置,可以指明 只保留所需语言 的资源程序集,从而在发布时跳过其它语言:
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
这里将语言限制为英文(en),发布输出将仅包含该语言资源,大幅减小体积。你也可以指定多个语言,用分号分隔如 en;de;it。此配置适用于多数 ASP.NET Core 版本中有效。
方案二:排除特定 NuGet 包的本地化资源
部分包(如 Microsoft.VisualStudio.Web.CodeGeneration.Design)中包含大量语言程序集。如果这些功能不需要运行时使用,可以通过如下方式阻止其内容复制:
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="x.y.z" ExcludeAssets="All" />
这种方式会阻止该包所有资源被复制,包括本地化资源,从而避免生成多语言文件夹。但要注意可能会影响 scaffolding 等功能。
方案三:自定义 MSBuild 任务在发布后删除或跳过资源
如果前面方法不生效,你还可以在项目中添加 MSBuild 自定义任务,在发布后手动删除这些资源文件夹:
<Target Name="RemoveSatelliteAssemblies" AfterTargets="ResolveAssemblyReferences">
<ItemGroup>
<ReferenceCopyLocalPaths Remove="@(ReferenceSatellitePaths)" />
</ItemGroup>
</Target>
或者列出输出目录里的所有 .resources.dll 并删除对应文件夹。虽然这种方式较为粗暴,但在无法控制源资源时也能精简发布内容。
其他文件夹的生成说明
除了语言 folder,还有可能看到 refs 目录,这通常用于保留 Razor 视图编译时所需的引用程序集,保证运行时环境一致。可以通过关闭运行时视图编译(设置 PreserveCompilationContext 为 false)避免生成该 refs 文件夹。
还有 Views、Pages 等目录,如果你的 MVC 项目启用了运行时编译,未预编译 Razor 视图时会保留这些文件。
建议流程与优化思路
- 如果你的应用只面向英文用户或其中语言固定,应优先在 .csproj 中设置 SatelliteResourceLanguages,只保留必要语言。
- 若引用了 scaffolding 或代码生成包但不在生产中使用,考虑使用 ExcludeAssets="All" 排除包资源。
- 若需要最小化发布体积,可结合 MSBuild 脚本在发布后删除语言资源文件夹。
- 如果不使用 Razor 运行时编译,建议预编译视图并关闭 PreserveCompilationContext,以避免 refs、Views 等额外目录生成。
ASP.NET Core 发布时生成的 af、ar、az、bg 等文件夹,属于 .NET 本地化体系中的卫星资源程序集,默认包含多语言资源,是为了支持国际化而准备的。如果你只需要发布英文版本,完全可通过配置过滤策略(如 SatelliteResourceLanguages)或排除引用包资源来减少这些文件。合理配置后可显著缩小发布包大小,并提升部署效率与可维护性。