将第三方库重新打包为NuGet包

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

我正在使用支持.NET Core,但不支持.NET Standard的第三方库。它们为所支持的每个平台提供单独的二进制SDK。 win-x86,linux-x64等。对于每个平台,都有一个CoolSdkDotNetCore.dll和coolsdk.dll / so / dylib。每个平台的CoolSdkDotNetCore.dll文件确实不同-它们的大小完全相同,但是具有不同的SHA哈希。

出于我自己的理智,我想使用运行时标识符将所有这些打包为单个.nupkg,以便为给定平台提取正确的内容,这样我就可以为Windows,docker等进行构建,而不必交换二进制文件周围。我有一个类似这样的项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>CoolSdk.NetStandard</PackageId>
    <Version>1.2.3</Version>
    <RootNamespace>coolsdk</RootNamespace>
    <AssemblyName>coolsdk</AssemblyName>
  </PropertyGroup>

  <ItemGroup>

    <None Pack="true" PackagePath="runtimes/win-x64/native/coolsdk.dll" Update="windows/x64/coolsdk.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/win-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="windows/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

    <None Pack="true" PackagePath="runtimes/linux-x64/native/libcoolsdk.so" Update="linux/x64/libcoolsdk.so">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/linux-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="linux/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

  </ItemGroup>

</Project>

这会产生.nupkg,似乎具有我需要的所有内容,但是使用中的项目实际上并未获得对CoolSdkDotNetCore程序集的引用。在bin文件夹中,我看到带有native组件的运行时文件夹,但没有lib文件夹(lib文件夹肯定存在于实际的nupkg中)。

我在这里想念什么?我需要自己回写nuspec而不是尝试使用csproj为我生成全部吗?还是我可以使用其他技巧?


编辑:

将上面的库路径从runtimes/<rid>/lib/netcore更改为runtimes/<rid>/netcoreapp,可以将lib文件夹复制到使用项目中的bin文件夹中,但是我仍然无法真正引用该程序集。手动添加对CoolSdkDotNetCore的引用,例如:

<Reference Include="CoolSdkDotNetCore">
  <HintPath>CoolSdkDotNetCore.dll</HintPath>
</Reference>

产生MSB3245 - Could not resolve this reference...

.net-core nuget .net-standard
1个回答
0
投票

答案是将.NET Core程序集的单个副本作为“引用”。哪一个并不重要-该程序集永远不会运行,仅由IDE加载并在编译时运行。在运行时,将从runtimes文件夹中加载正确的程序集。作为最终的陷阱,nuget不会将同一文件打包两次。如果项目组中有两个或更多项目,且Update键的值相同,则实际上只有最后一个会添加到最后一个.nupkg中。因此,随机选择了我在项目根目录下的Windows / x64 dll副本,并因此更新了我的csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>CoolSdk.NetStandard</PackageId>
    <Version>1.2.3</Version>
    <RootNamespace>coolsdk</RootNamespace>
    <AssemblyName>coolsdk</AssemblyName>
    <IncludeBuildOutput>false</IncludeBuildOutput>
  </PropertyGroup>

  <ItemGroup>
    <None Pack="true" PackagePath="ref/netcoreapp2.1/CoolSdkDotNetCore.dll" Update="CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

    <None Pack="true" PackagePath="runtimes/win-x64/native/coolsdk.dll" Update="windows/x64/coolsdk.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/win-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="windows/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

    <None Pack="true" PackagePath="runtimes/linux-x64/native/libcoolsdk.so" Update="linux/x64/libcoolsdk.so">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/linux-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="linux/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

  </ItemGroup>

</Project>
© www.soinside.com 2019 - 2024. All rights reserved.