【问题标题】:NuGet dependency files copied in build output directory when targeting .NET Core+ but not copied for .NET FrameworkNuGet 依赖文件在面向 .NET Core+ 时复制到构建输出目录中,但未针对 .NET Framework 复制
【发布时间】:2021-07-31 04:57:22
【问题描述】:

我制作了一个 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(net461net48)为目标,则此 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>

【问题讨论】:

    标签: .net nuget nuget-package


    【解决方案1】:

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

    当您的平台为 net472 时,一种选择可能是将目标文件添加到您的 NuGet 包中,该文件将相关 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/

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

    自动化项目真的很棒,以后会用到

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 2019-01-28
      • 2017-10-05
      • 2017-08-09
      • 2021-08-25
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多