.net - NuGet 依赖文件在面向 .NET Core+ 时复制到构建输出目录中,但未针对 .NET Framework 复制
问题描述
我制作了一个 NuGet 包Askaiser.Marionette,它针对 .NET Standard 2.0/2.1 和 .NET 5。
它的两个依赖项是OpenCvSharp4
和OpenCvSharp4.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>
解决方案
我不确定这是否是最简洁的解决方案,但我敢肯定你已经为解决这个问题苦苦挣扎了一段时间。
一种选择可能是将目标文件添加到 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/
这可能有点离题,但我看到您也在 NuGet 包中添加了 PDB 文件,查看 SourceLink 以根据请求下载符号可能是个好主意。
自动化项目真的很棒,将来会使用它
推荐阅读
- discord.js - AsyncFunction:discord.js 中的消息错误
- python - 如何区分系列或numpy数组中的负号和正号变化
- vb.net - 将复选框值传递给水晶报表参数
- firebase - firebase 中的并发写入会引发错误吗?
- kotlin - Tailrec 阶乘
- laravel - 显示数组数据时为 foreach() 提供的参数无效
- java - 使用 Spring Boot 后将新用户写入 JSON 文件
- string - 尝试从文本文件中读取数据时出现字符串索引超出范围错误
- javascript - 强制从其 cdn URL javascript 下载 mp3 文件
- java - List 到 2 维字符串的列表