CPack NuGet软件包

时间:2020-06-08 15:14:43

标签: c# cmake nuget clr cpack

上下文

我有一个Managed C ++ / CLR库,它使用CMake 3.17构建,并使用CPack打包到NuGet包中。由于软件包管理器发出以下错误,因此无法将生成的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使用包含的源文件以及在相应目标ManagedLibrary上设置的以下属性来构建托管C ++库:

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',然后使用cmake --build . --target PACKAGE从CLI运行PACKAGE步骤,该步骤成功生成了nupkg文件。

问题

NuGet如何知道要添加引用的库?

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

最后,如果有人对使用C ++ / CLR进行打包和多目标化以支持不同的框架版本/体系结构/构建配置有所了解,那么对此的任何注释将不胜感激。

1 个答案:

答案 0 :(得分:0)

NuGet如何知道要添加引用的库?

主要是,NuGet从程序包结构中推断出要引用的库。必须将托管程序集放在libs/<TFWM>的目录中,其中TFWM是Target Framework Moniker(例如.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。就我而言,我想定位到64位Windows,因此运行时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
      ...

我希望这对以后的人有所帮助。