我正在使用支持.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程序集的单个副本作为“引用”。哪一个并不重要-该程序集永远不会运行,仅由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>