.net core 将第三方库重新打包为NuGet包

.net core 将第三方库重新打包为NuGet包,.net-core,nuget,.net-standard,.net Core,Nuget,.net Standard,我使用的第三方库支持.NET核心,但不支持.NET标准。它们为支持的每个平台提供单独的二进制SDK;win-x86、linux-x64等。对于每个平台,都有一个CoolSdkDotNetCore.dll和一个coolsdk.dll/so/dylib。每个平台的CoolSdkDotNetCore.dll文件确实不同-它们的大小完全相同,但具有不同的SHA哈希 为了我自己的理智,我想将所有这些重新打包为一个.nupkg,使用运行时标识符为给定平台引入正确的内容,这样我就可以为Windows、dock

我使用的第三方库支持.NET核心,但不支持.NET标准。它们为支持的每个平台提供单独的二进制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>


生成
MSB3245-无法解析此引用…

答案是将.NET核心程序集的单个副本作为“ref”包含。哪一个并不重要——这个程序集永远不会运行,只能由IDE在编译时加载。在运行时,将从
运行时
文件夹加载正确的程序集。最后,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>

netstandard2.0
真的
CoolSdk.NetStandard
1.2.3
酷SDK
酷SDK
假的
总是
总是
总是
总是
总是

答案是将.NET核心程序集的单个副本作为“参考”包含在内。哪一个并不重要——这个程序集永远不会运行,只能由IDE在编译时加载。在运行时,将从
运行时
文件夹加载正确的程序集。最后,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>

netstandard2.0
真的
CoolSdk.NetStandard
1.2.3
酷SDK
酷SDK
假的
总是
总是
总是
总是
总是