【问题标题】:Why are native dll's from dependent libraries not included in build output?为什么依赖库中的本机 dll 不包含在构建输出中?
【发布时间】:2023-04-01 23:25:01
【问题描述】:

我们正在使用 IBM 的 DB2 库从 C# 访问 DB2 https://www.nuget.org/packages/IBM.Data.DB2.Core/

我们希望将 IBM 的库封装在我们自己的库中,为应用程序开发人员添加与 DB2 相关的功能。

问题在于 IBM 的库是基于其包中包含的本机 dll。然而,当 IBM 库仅通过我们自己的 DB2 包装库间接引用时,这些本机 dll 不会复制到构建输出文件夹

我怀疑我需要在我们自己的库中包含本机 dll。只有我不知道该怎么做。

我们为包装库创建的 nuget 包是从 csproj 文件创建的

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <Version>1.0.0</Version>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="IBM.Data.DB2.Core" Version="1.3.0.100" />
  </ItemGroup>

</Project>

【问题讨论】:

    标签: .net nuget csproj


    【解决方案1】:

    这很复杂。 NuGet 有两种使用包的方式,这两种方式的工作方式略有不同。原来的方式是packages.config(PC),新的方式是PackageReference(PR)。

    带有 PC 的 NuGet 没有运行时的概念,因此它们经常以这种方式实现,并且快速查看包,似乎是这种情况,包作者将 MSBuild 道具和/或目标文件捆绑在包中,并且这些目标会修改构建以在构建时复制本机文件。使用PC的项目,在安装包的时候,所有的依赖也都安装好了,所以所有的包都是项目的直接依赖,包中的任何构建目标都会导入到项目中。

    另一方面,使用 NuGet 和 PR 的项目只能引用它们的直接依赖项,但包的依赖项是可传递的。 NuGet 仅告诉 MSBuild 从直接依赖项导入构建目标,而不是传递依赖项。这解释了您所看到的行为。

    在 NuGet 5.0(与 Visual Studio 2019 一起发布,我不记得 .NET Core SDK 的哪个版本)中,我们添加了一个 buildTransitive 功能,该功能将从传递包中提取构建道具/目标。但是,它需要包作者重新编写他们的包才能使用它。

    【讨论】:

    • 谢谢zivkan。我没有找到有关此功能的太多文档。但是我从这篇文章中了解到github.com/NuGet/Home/wiki/…IBM 应该在他们的 nuget-package 中修改他们的文件夹结构。因此本机 dll 将具有交互性。对吗?
    • 我刚刚尝试重新打包 IBM 的库。看起来添加 buildTransitive 文件夹是不够的。您知道此功能的任何文档吗?或者也许是一个使用过的样本,我可以看看?
    • 不幸的是,实现它的开发人员在编写文档之前就离开了团队。我认为它适用于same way as the build folder。 NuGet 本身只关心 props 和 targets 文件,但前提是扩展之前的位与包 id 完全匹配。由 props 和 targets 文件来对任何其他文件做正确的事情。如果还原后文件没有出现在 nuget.g.props 或 nuget.g.targets 中,则说明包中的文件名错误
    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2020-09-12
    • 2023-03-30
    • 2015-04-19
    相关资源
    最近更新 更多