如何创建包含运行时特定托管程序集的多目标NuGet包?
如何创建包含运行时特定托管程序集的多目标NuGet包?
嘿,我之前也碰到过一模一样的问题!用nuspec加自定义MSBuild目标做带运行时特定程序集的NuGet包,最容易踩的就是路径和配置不规范的坑,给你梳理下正确的操作方法:
先搞对NuGet包的核心结构
这是最关键的一步,NuGet对ref和runtimes文件夹的路径有严格要求:ref文件夹:专门放编译时用的"瘦"程序集,路径要按目标框架划分,比如ref/net6.0/YourAssembly.dll,这些程序集只包含类型定义,不含具体运行时实现,用于编译时的引用检查runtimes文件夹:放对应运行时的完整实现程序集,路径必须遵循runtimes/{运行时标识符}/lib/{目标框架}/YourAssembly.dll的格式,比如runtimes/win-x64/lib/net6.0/YourAssembly.dll、runtimes/linux-x64/lib/net6.0/YourAssembly.dll,NuGet会自动根据项目的运行时标识符(RID)匹配加载对应的程序集
Nuspec文件要正确配置文件包含规则
你得在nuspec的<files>节点里明确指定要打包的文件,不能靠自动发现,举个例子:<files> <!-- 加入编译引用的程序集 --> <file src="bin/Release/net6.0/ref/YourAssembly.dll" target="ref/net6.0/YourAssembly.dll" /> <!-- 加入Windows x64的运行时程序集 --> <file src="bin/Release/net6.0/win-x64/YourAssembly.dll" target="runtimes/win-x64/lib/net6.0/YourAssembly.dll" /> <!-- 加入Linux x64的运行时程序集 --> <file src="bin/Release/net6.0/linux-x64/YourAssembly.dll" target="runtimes/linux-x64/lib/net6.0/YourAssembly.dll" /> </files>一定要注意路径的对应关系,目标框架和运行时标识符的拼写不能错,比如
win-x64不能写成win64,不然NuGet识别不出来自定义MSBuild目标别乱改默认逻辑
很多人踩坑是因为自定义的MSBuild目标覆盖了NuGet默认的运行时程序集解析规则。如果不是必须,尽量不要修改RuntimeAssemblyFiles、ReferenceAssemblyPaths这些核心属性;如果一定要加额外逻辑,要确保是在NuGet默认逻辑之后执行,别破坏原有的匹配机制测试项目要配对运行时标识符
测试项目得明确指定运行时标识符(RID),要么在csproj里加<RuntimeIdentifier>win-x64</RuntimeIdentifier>,要么在编译/运行的时候用命令行参数指定,比如dotnet run -r win-x64。另外测试项目的目标框架要和你的NuGet包目标框架一致,不然也会出现加载问题
备注:内容来源于stack exchange,提问作者Fa鸽
相关产品推荐
相关产品推荐

