如何创建只包含一次内容文件的多目标 NuGet 包

问题描述 投票:0回答:1

我正在为外部 C++ 库编写一个 .NET 绑定项目。想要将该库包含到 nupkg 文件中,因此用户只需安装该包即可使用它。该库与平台相关,是在 x64 和 arm64 处理器的其他目标中构建的。并且NuGet至少有两个目标框架——net6.0和net8.0 问题是 nuget 将库作为每个 .NET 框架的内容包含一次,并在包的根目录中包含一次 - 3 次!如果项目仅针对

netstandard2.0
,nupkg 仍包含该文件两次。该库非常大,因此即使是为单个 arch+os 构建,该包也至少比库本身大 2 倍。我无法在 nuget.org 上发布它,那里的大小限制约为 250MB。

csproj 文件的当前部分在这里:

  <ItemGroup>
    <Content Include="library.so" Pack="true" CopyToOutputDirectory="PreserveNewest" />
  </ItemGroup>

生成的 Nupkg 文件结构如下:

...
./contentFiles/any/net6.0/library.so
./contentFiles/any/net8.0/library.so
./content/library.so
...

该库是原生的,对于 net6 和 net8 显然是相同的。 如何构建一个包,其中文件仅包含一次?或者有什么建议如何避免强迫用户手动安装库?

c# .net-core binding msbuild nuget
1个回答
0
投票

如果打包本机库,您可能希望通过指定“神奇”路径来指示特定于运行时的资源,而不是使用

Content
(以及相关的 NuGet 默认值):

<None Include="library.so" Pack="true" PackagePath="runtimes/linux-x64/native/" />

通过这种方式,您还可以为不同的运行时指定多个 .so/.dll/.dylib 文件,.NET SDK 将选择当前的文件进行构建,并且在发布时,项目中会包含一个运行时文件夹,主机会自动选择在目标平台上运行时是正确的。

有关更多详细信息,请参阅在 .NET 包中包含本机库

© www.soinside.com 2019 - 2024. All rights reserved.