【问题标题】:CPack NuGet PackagesCPack NuGet 包
【发布时间】:2020-09-27 14:38:19
【问题描述】:

上下文

我有一个使用 CMake 3.17 构建并使用 CPack 打包到 NuGet 包中的托管 C++/CLR 库。生成的 nupkg 文件无法导入 C# 项目,因为包管理器发出以下错误:“[snip] 包不包含任何与 [.NETFramework,Version=v4.5.2] 兼容的程序集引用或内容文件] ”。但是,在添加到解决方案时添加对项目或构建生成的相应库文件的引用可以按预期工作。

C++/CLR 细节

代码本身是非常基本的,并生成一个可以从另一个项目引用的有效库,当通过 Visual Studio 2017 手动添加引用时 -> 添加引用(可以通过这种方式添加项目或相应的库,并且都一样)。

代码由类本身组成,AssemblyInfo.cpp 提供仅描述元数据和版本信息的属性。依赖项仅包括 System、System::Runtime::InteropServices 和大量预构建的本地库。

我没有添加 .nuspec 文件,也没有添加 nuget.config 文件,我相信后者是由 CPack NuGet 生成器在构建包时生成的。

CMake / CPack 详细信息

CPack NuGet 支持相对较新,我未能成功找到一个工作示例,但我成功地生成了一个 nupkg 文件。首先指示 CMake 使用包含的源文件构建托管 C++ 库,并在相应的目标 ManagedLibrary 上设置以下属性:

set_target_properties (ManagedLibrary PROPERTIES DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2")
set_target_properties (ManagedLibrary PROPERTIES COMMON_LANGUAGE_RUNTIME "")

文档指出这将生成 CLR/混合代码并按照宣传的方式工作,因此我能够成功地针对目标框架进行构建。下一步是将库安装在我认为正确的位置:

install (TARGET ManagedLibrary DESTINATION . COMPONENT MixedCLR)

并且支持(本机 C++)库的安装方式类似:

install (FILES [various..] DESTINATION . COMPONENT MixedCLR)

我还将 CPACK_GENERATOR 设置为“NuGet”,然后使用成功生成 n​​upkg 文件的 cmake --build . --target PACKAGE 从 CLI 运行 PACKAGE 步骤。

问题

NuGet 如何知道要向哪些库添加引用?

  1. 是否需要 nuspec 文件?如果是这样,其中必须至少包含什么,以及如何将其包含在目标 CMakeLists.txt 中?
  2. 是否可以将托管库以及支持的本机库放在包的根目录中?如果没有,他们应该去哪里?
  3. nupkg 文件中是否通常包含任何其他文件?

最后,如果有人知道有关在 C++/CLR 中打包和多目标以支持不同框架版本/架构/构建配置的任何信息,我们将不胜感激。

【问题讨论】:

  • 这是一个非常受欢迎的链接,我特别感谢包含详细文档。我会仔细研究一下,然后再报告。

标签: c# cmake nuget clr cpack


【解决方案1】:

NuGet 如何知道要向哪些库添加引用?

NuGet 主要从包结构推断要引用的库。托管程序集必须放在libs/<TFWM> 的目录中,其中TFWM 是目标框架名字对象(例如:.NET Framework 4.5.2 => net452)。

Is a nuspec file required? If so, what must minimally be included in it, and how do I include it in the target CMakeLists.txt?

nuspec 文件由 CPack 在包生成时自动生成。生成的文件保存到输出目录,并会保留install命令指定的目录结构。

Is it acceptable to put the managed library, along with supporting native libraries, in the root of the package? If not, where should

他们走了?

如前所述,托管库位于libs/blah。另一方面,本机库进入runtimes/<RID>/native,其中RID 是运行时ID。在我的例子中,我想以 Windows 64 位为目标,所以运行时 ID 是 win-x64

Are any other files generally included in a nupkg file?

为了方便起见,我捆绑了 PDB,但我不需要指定任何其他文件或属性。

最后,如果有人对打包和多目标有所了解的话 在 C++/CLR 中支持不同的框架版本/架构/ 构建配置,对此的任何注释将不胜感激。

如果针对多个框架版本,只需创建多个目标并将其安装到各自的文件夹中,没有什么比处理更复杂的了。

最后,我完成的包结构如下所示:

libs/
  net452/
    ManagedLib.dll
    ManagedLib.pdb
runtimes/
  win-x64/
    native/
      NativeLib1.dll
      NativeLib2.dll
      ...

我希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2020-10-15
    • 2021-08-07
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多