创建NuGet包时,能否用通配符批量包含*.resource.dll及所有资源文件?
当然可以!完全不用一个个手动指定所有资源文件,NuGet支持通配符来批量包含这些文件,能省超多时间,尤其是当你有大量区域性资源(比如各种语言的*.resource.dll)的时候。
用通配符在.nuspec中批量包含资源文件
1. 基础通配符写法
在你的.nuspec文件的<files>节点里,只需要简单的通配符就能匹配所有目标文件。举个例子,如果你的资源文件都输出在bin\Release\net6.0目录及子文件夹中(比如各语言的zh-CN、en-US文件夹里的*.resource.dll),可以这么配置:
<files> <!-- 递归匹配所有子目录下的*.resource.dll文件 --> <file src="bin\Release\net6.0\**\*.resource.dll" target="lib\net6.0\**" /> <!-- 如果还有.resx等其他资源文件,也可以用同样方式批量包含 --> <file src="bin\Release\net6.0\**\*.resx" target="lib\net6.0\**" /> </files>
这里的**是递归通配符,会匹配所有嵌套层级的子目录;*则用来匹配文件名中的任意字符(不含目录分隔符),完美覆盖所有资源文件。
2. 保留区域性资源的目录结构
通常*.resource.dll作为区域性附属程序集,会存放在对应语言代码的子文件夹里。上面的配置中target="lib\net6.0\**"会原样保留源文件的目录结构,这样当用户安装你的NuGet包时,这些资源文件会被自动部署到项目的对应语言目录下,保证功能正常。
3. 几个小提醒
- 要确认
src路径是相对于.nuspec文件所在位置的,路径写错会导致匹配不到文件哦。 - 如果你的项目是SDK风格(比如.NET Core/.NET 5及以上版本),其实也可以不用手动编写
.nuspec,直接在.csproj文件里配置批量打包:
<ItemGroup> <None Include="bin\Release\net6.0\**\*.resource.dll" Pack="true" PackagePath="lib\net6.0\**" /> </ItemGroup>
不过如果习惯用.nuspec管理包内容,还是第一种方法最直接。
内容的提问来源于stack exchange,提问作者Masterlud
相关产品推荐
相关产品推荐

