在VS2019 C ++跨平台程序中包含nuget包

时间:2019-10-21 14:34:24

标签: c++ linux windows cmake nuget

我的任务是开始用CMake设计C ++跨平台程序。我们的主要依赖项之一涉及内部nuget程序包。对于我们的Windows C ++项目,我只需右键单击该项目,然后选择管理Nuget程序包。在跨平台中,没有这样的选择,我正在努力寻找有关如何处理这些依赖项的任何相关信息。任何人都可以将我链接到任何好的信息来源或演示吗?

1 个答案:

答案 0 :(得分:1)

编辑:从CMake 3.15开始,CMake支持使用VS_PACKAGE_REFERENCES引用Nuget软件包。现在,这是一个比以下建议的解决方法更 更清洁的解决方案。要将Nuget软件包引用添加到CMake目标,请使用软件包名称和软件包版本,并用下划线_分隔;这是BouncyCastle版本1.8.5的示例:

set_property(TARGET MyApplication
    PROPERTY VS_PACKAGE_REFERENCES "BouncyCastle_1.8.5"
)

在CMake 3.15之前,CMake没有用于Nuget支持的内置命令,因此您将必须使用nuget command line utilities来使用CMake包括Nuget依赖项。

您可以使用CMake的find_program()来定位nuget命令行实用程序(已安装),再结合add_custom_command()execute_process()来执行nuget命令CMake。此question的答案进行了更详细的讨论,但从本质上来说,它可能看起来像这样:

# Find Nuget (install the latest CLI here: https://www.nuget.org/downloads).
find_program(NUGET nuget)
if(NOT NUGET)
    message(FATAL "CMake could not find the nuget command line tool. Please install it!")
else()
    # Copy the Nuget config file from source location to the CMake build directory.
    configure_file(packages.config.in packages.config COPYONLY)
    # Run Nuget using the .config file to install any missing dependencies to the build directory.
    execute_process(COMMAND 
        ${NUGET} restore packages.config -SolutionDirectory ${CMAKE_BINARY_DIR}
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    )
endif()

这假设您已有一个packages.config文件,其中列出了项目的nuget依赖项。

要将依赖关系绑定到特定目标,(不幸的)您必须使用nuget放置程序集/库的完整路径。

对于.NET nuget软件包,它看起来像这样:

# Provide the path to the Nuget-installed references.
set_property(TARGET MyTarget PROPERTY 
    VS_DOTNET_REFERENCE_MyReferenceLib
    ${CMAKE_BINARY_DIR}/packages/path/to/nuget/lib/MyReferenceLib.dll
)

对于C ++风格的nuget包,它可能看起来像这样:

add_library(MyLibrary PUBLIC
    MySource.cpp
    MyClass1.cpp
    ...
)

# Provide the path to the Nuget-installed libraries.
target_link_libraries(MyLibrary PUBLIC 
    ${CMAKE_BINARY_DIR}/packages/path/to/nuget/lib/MyCppLib.dll
)

顺便说一句,CMake 确实支持带有CPack的Nuget软件包的 creation 。这是CPack Nuget生成器的documentation