关于NuGet单包集成本地化资源的疑问:为何无法直接包含资源文件?
解决单NuGet包包含所有本地化资源的问题
你遇到的其实是NuGet默认行为和你的需求不匹配的情况——默认它会把.resources.dll当作独立的本地化卫星程序集排除在主包外,但完全可以通过调整项目配置或者打包参数来实现单包包含所有资源的需求,具体方法如下:
方法1:修改foo.csproj项目文件(推荐)
直接在项目文件里添加规则,让打包时自动包含所有资源文件,同时保留正确的目录结构(这样安装到bar.csproj时资源会自动部署到对应语言目录):
- 右键foo.csproj选择“编辑项目文件”
- 添加以下ItemGroup配置:
<ItemGroup> <!-- 包含所有输出目录下的.resources.dll文件,保留原语言目录结构 --> <None Include="bin\$(Configuration)\$(TargetFramework)\**\*.resources.dll" Pack="true" PackagePath="lib\$(TargetFramework)\%(RecursiveDir)" /> </ItemGroup>
这个配置会把编译后生成的各个语言目录下的.resources.dll都打包到NuGet包的对应路径下,保持原有的语言文件夹结构。
如果想精准控制要包含的语言,还可以在PropertyGroup里添加指定规则,比如只包含英文和简体中文:
<PropertyGroup> <SatelliteResourceLanguages>en-US,zh-Hans</SatelliteResourceLanguages> </PropertyGroup>
方法2:使用nuget.exe打包参数
如果你不想修改项目文件,可以在打包时通过参数强制包含资源文件:
nuget.exe pack foo.csproj -Include "bin\Release\**\*.resources.dll" -Properties "Configuration=Release"
不过这种方式需要手动指定路径,不如修改项目文件灵活,切换编译配置时容易出错。
验证效果
打包完成后,你可以用NuGet Package Explorer打开生成的.nupkg文件,确认lib/{你的目标框架}目录下包含各个语言文件夹(比如zh-Hans、en-US)以及对应的.resources.dll。
当你把这个包安装到bar.csproj后,编译bar项目时,NuGet会自动将对应的资源文件复制到bar的输出目录的语言文件夹下,不需要额外添加引用——只要主foo.dll被引用,资源文件就会被正确部署。
简单来说,你没遗漏什么“隐藏设置”,只是需要显式覆盖NuGet默认的卫星程序集排除规则而已~
内容的提问来源于stack exchange,提问作者Hannes
相关产品推荐
相关产品推荐

