多目标nuget包不包含运行时文件

时间:2018-04-18 23:16:56

标签: nuget-package .net-standard csproj

我有一个.NETStandard 2.0类库,它是通过Nuget分发的。它包括特定于我们的目标平台的已编译的本机代码库。 .csproj看起来像这样:

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>CoolProject</PackageId>
    <Version>0.8.1</Version>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="AnotherCoolProject" Version="0.3.2" />
    <PackageReference Include="YetAnotherCoolProject" Version="7.4.2" />
  </ItemGroup>

  <ItemGroup>

    <None Pack="true" PackagePath="runtimes/win-x86/native/library32.dll" Update="library32.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/win-x64/native/library64.dll" Update="library64.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/linux-x64/native/liblibrary.so" Update="liblibrary.so">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

这适用于所有支持平台上的.NET Core应用程序。但是,最近,我们发现了.NET Framework应用程序中使用此库的问题 - 运行时库并不总是复制到引用项目,导致System.IO.FileNotFoundException异常。这似乎与此问题有关:

https://github.com/Microsoft/msbuild/issues/1582

作为一种解决方法,我们希望向包中添加Framework 4.6.1目标。如果我只是更新上面的项目文件,删除TargetFramework属性并添加

<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>

项目构建没有错误,并且net461下的netstandard2.0lib/文件夹创建了nupkg,但不再包含任何运行时文件。我可以通过解压缩.nupkg来验证这一点,但是随着包大小从大约2mb变为大约20kb,它非常明显。我已尝试在ItemGroup中添加条件

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">

但仍然没有。我在这里缺少什么?

0 个答案:

没有答案