面向多平台、架构与.NET版本创建Nuget包的配置问题排查
你的配置存在以下几处核心错误,按优先级排序如下:
- 目标框架不匹配,导致编译时引用无法被识别
你/lib目录下存放的是.NET Framework 4.7编译的Foo.dll,但nuspec中依赖组声明的目标框架是.NETFramework4.8,NuGet会优先匹配对应版本的lib目录下的程序集,找不到对应版本的程序集就不会自动添加项目引用,自然无法识别库中功能。
你要么把/lib/net4.7目录改名为/lib/net48,要么把nuspec中的依赖组目标框架改为.NETFramework4.7(.NET Framework是向下兼容的,4.7编译的库可以被4.8项目正常引用)。 - 未在nuspec中声明需要打包的文件,生成的NuGet包没有包含实际程序集
你当前的nuspec只写了依赖配置,没有添加<files>节点指定要把/lib、/runtimes目录下的文件打包进最终的nupkg文件,打包命令执行时不会自动识别目录结构把文件塞进去,导致你打出来的包是空的,引用后当然找不到任何功能。
需要在nuspec的</metadata>节点后面添加如下配置:
<files> <!-- 编译时引用的托管程序集 --> <file src="lib\net47\Foo.dll" target="lib\net48\Foo.dll" /> <file src="lib\net5.0\Foo.dll" target="lib\net5.0\Foo.dll" /> <!-- 运行时原生依赖 --> <file src="runtimes\win10-x64\native\ExternalLib.dll" target="runtimes\win10-x64\native\ExternalLib.dll" /> <file src="runtimes\win10-x86\native\ExternalLib.dll" target="runtimes\win10-x86\native\ExternalLib.dll" /> <file src="runtimes\linux-x64\native\ExternalLib.dll.so" target="runtimes\linux-x64\native\ExternalLib.dll.so" /> </files>
- 打包命令错误
官方打包命令是nuget pack Project.nuspec,不存在nuspec pack命令,你执行的错误命令大概率生成了不符合预期的无效包。 - .NET Framework 4.8原生依赖兼容问题
.NET Framework默认不会自动拷贝runtimes目录下的原生依赖到输出目录,你需要额外在NuGet包中添加自定义.targets文件,强制编译时拷贝对应架构的原生dll到输出目录,才能保证运行时能找到依赖。 - 可选优化项
你可以在nuspec的metadata节点添加<packageTypes><packageType name="Dependency" /></packageTypes>明确包类型,同时把运行时标识win10-x64/x86换成更通用的win-x64/x86,适配更多Windows版本。
内容的提问来源于stack exchange,提问作者elo
相关产品推荐
相关产品推荐

