首页 > 解决方案 > NuGet 依赖文件在面向 .NET Core+ 时复制到构建输出目录中,但未针对 .NET Framework 复制

问题描述

我制作了一个 NuGet 包Askaiser.Marionette,它针对 .NET Standard 2.0/2.1 和 .NET 5。

它的两个依赖项是OpenCvSharp4OpenCvSharp4.runtime.win(Windows x64/x86 的本机 OpenCV 绑定)。

每当我在 .NET Core 应用程序或 .NET 5 应用程序中使用我的包时,任何OpenCvSharp4方法都可以正常工作,因为在构建输出目录中有runtimes一个包含本机 OpenCV 库的目录:

Debug/<netcoreapp3.1>/
├── <...>
└── runtimes/
    ├── unix/<...>
    ├── win/<...>
    ├── win-x64/native/OpenCvSharpExtern.dll
    └── win-x86/native/OpenCvSharpExtern.dll

但是,如果我的应用程序以 .NET Framework(net461最高net48)为目标,则构建输出目录中缺少此runtimes目录从而导致任何 OpenCV 包装方法失败。当消费者应用程序也安装这两个OpenCvSharp4包时,此问题已修复。

为什么消费者应用程序需要安装OpenCvSharp4包才能在 .NET Framework 上运行?现在,任何试图在 .NET Framework 上使用我的包的人都必须这样做。这不方便。

如果它有帮助,这就是我生成的.nuspec样子:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>Askaiser.Marionette</id>
    [...]
    <dependencies>
      <group targetFramework="net5.0">
        <dependency id="OpenCvSharp4" version="4.5.2.20210404" exclude="Build,Analyzers" />
        <dependency id="OpenCvSharp4.runtime.win" version="4.5.2.20210404" exclude="Build,Analyzers" />
        <dependency id="Tesseract" version="4.1.1" include="All" />
        <dependency id="Tesseract.Drawing" version="4.1.1" exclude="Build,Analyzers" />
      </group>
      <group targetFramework=".NETStandard2.0">
        <dependency id="OpenCvSharp4" version="4.5.2.20210404" exclude="Build,Analyzers" />
        <dependency id="OpenCvSharp4.runtime.win" version="4.5.2.20210404" exclude="Build,Analyzers" />
        <dependency id="System.Text.Json" version="5.0.2" exclude="Build,Analyzers" />
        <dependency id="Tesseract" version="4.1.1" include="All" />
        <dependency id="Tesseract.Drawing" version="4.1.1" exclude="Build,Analyzers" />
      </group>
      <group targetFramework=".NETStandard2.1">
        <dependency id="OpenCvSharp4" version="4.5.2.20210404" exclude="Build,Analyzers" />
        <dependency id="OpenCvSharp4.runtime.win" version="4.5.2.20210404" exclude="Build,Analyzers" />
        <dependency id="System.Text.Json" version="5.0.2" exclude="Build,Analyzers" />
        <dependency id="Tesseract" version="4.1.1" include="All" />
        <dependency id="Tesseract.Drawing" version="4.1.1" exclude="Build,Analyzers" />
      </group>
    </dependencies>
    [...]
  </metadata>
</package>

标签: .netnugetnuget-package

解决方案


我不确定这是否是最简洁的解决方案,但我敢肯定你已经为解决这个问题苦苦挣扎了一段时间。

一种选择可能是将目标文件添加到 NuGet 包,当您的平台为 net472 时,该文件将相关 DLL 复制到构建的输出目录。

目标文件可能包含类似于以下内容:

<ItemGroup>
    <Content Include="$(PkgOpenCvSharp4_runtime_win)\runtimes\win-x86\native\OpenCvSharpExtern.dll" >
      <Link>runtimes\OpenCvSharpExtern.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <CopyToPublishDirectory>Always</CopyToPublishDirectory>
    </Content>
  </ItemGroup>
<ItemGroup>
    <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.5.2.20210404" GeneratePathProperty="true"/>
</ItemGroup>

您必须使用针对 .net 4.7.2 的条件来包装它

有关定位的工作原理,请查看 GRPC NuGet 包, https: //www.nuget.org/packages/Grpc.Core/

GRPC

这可能有点离题,但我看到您也在 NuGet 包中添加了 PDB 文件,查看 SourceLink 以根据请求下载符号可能是个好主意。

自动化项目真的很棒,将来会使用它


推荐阅读