.net core 将第三方库重新打包为NuGet包
我使用的第三方库支持.NET核心,但不支持.NET标准。它们为支持的每个平台提供单独的二进制SDK;win-x86、linux-x64等。对于每个平台,都有一个CoolSdkDotNetCore.dll和一个coolsdk.dll/so/dylib。每个平台的.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
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
假的
总是
总是
总是
总是
总是