Conan C/C++ 包管理器可以与任何构建系统配合使用,以管理和共享二进制文件,并定位任何操作系统、编译器和架构。这篇博文提供了一个简短的教程,展示了如何使用 Conan 直接通过纯 Visual Studio 方法创建、共享和使用二进制包。

Microsoft 推出了 vcpkg,这是一个基于 CMake 脚本的 Visual Studio 包管理器。虽然它可以用于从源代码获取和构建 OSS 库的最新稳定版本,但在用作用户项目的依赖项管理器时,它也有一些限制。其中之一是项目通常规模较大,需要管理预构建的二进制文件,因为并非总是可行从源代码构建。另一个不便之处是,同时安装同一包的不同版本需要管理 vcpkg 的不同实例。

在本教程中,您将看到 Conan 可用作纯 Visual Studio 和混合堆栈的包管理器。您还将看到,当使用 Conan 时,您无需从源代码构建;您还可以根据需要管理和共享尽可能多的配置的二进制文件。

本教程的主要步骤是

  1. 克隆并构建一个示例“Hello World” Visual Studio 项目
  2. 从现有项目创建 Conan 包
  3. 为不同的配置创建多个包二进制文件
  4. 将包上传到您的 Conan 服务器或 JFrog Artifactory
  5. 在使用者 Visual Studio 项目中重用现有包和二进制文件
  6. 从使用者项目创建 Conan 包

一个“Hello World” Visual Studio 项目

首先克隆现有的示例存储库。它包含一个简单的“Hello World”库和相应的应用程序

$ git clone https://github.com/memsharded/hello_vs
$ cd hello_vs

它包含一个包含源代码的src文件夹和一个包含 Visual Studio 2015 解决方案的build文件夹,该解决方案包含 2 个项目:一个名为“HelloLib”的静态库和一个名为“Greet”的应用程序。打开 Visual Studio 解决方案

$ build\HelloLib\HelloLib.sln

Greet设置为启动项目(右键单击Greet并选择设置为启动项目)然后使用 Ctrl+F5 构建并运行应用程序。(调试 -> 不调试启动)。请注意,由于hello.cpp文件包含一个#ifdef _DEBUG来在调试和发布消息之间切换,因此您可以切换到发布模式并获得不同的输出。

$ Hello World Debug!
# Switch IDE to Release mode, build and run again
$ Hello World Release!

创建 Conan 包

克隆的存储库已包含 Conan 配方

class HelloConan(ConanFile):
    name = "Hello"
    version = "0.1"
    license = "MIT"
    url = "https://github.com/memsharded/hello_vs"
    settings = "os", "compiler", "build_type", "arch"
    exports_sources = "src/*", "build/*"

    def build(self):
        cmd = tools.msvc_build_command(self.settings, "build/HelloLib/HelloLib.sln")
        self.run(cmd)

    def package(self):
        self.copy("*.h", dst="include", src="src")
        self.copy("*.lib", dst="lib", keep_path=False)

    def package_info(self):
        self.cpp_info.libs = ["HelloLib"]

此配方使用msvc_build_command()函数获取包含使用正确配置构建应用程序所需命令的命令字符串。

该配方还包含一个test_package文件夹,其中包含一个简单的示例使用者应用程序。在此示例中,使用者应用程序使用 CMake 进行构建,但它也可以使用 Visual Studio。我们使用 CMake 是因为它是由conan new生成的默认值,并且为了表明从 Visual Studio 项目创建的包也可以被其他构建系统(如 CMake)使用。这展示了 Conan 如何将构建系统解耦,这有助于例如逐步迁移到新的构建系统。

现在我们准备创建包了,建议关闭 Visual Studio IDE,清理 Visual Studio 的临时构建文件以避免出现问题,然后创建并测试包(此处使用系统默认值,假设它们是 Visual Studio 14、Release、x86_64)

# close VS
$ git clean -xdf
$ conan test_package
...
> Hello World Release!

除了关闭 IDE 并运行git clean之外,我们还可以配置exports_sources字段中更智能的过滤器,以便不会将临时构建文件导出到配方中。

为不同的配置创建不同的二进制文件

可以重复此过程以创建和测试不同配置的包

$ conan test_package -s arch=x86
$ conan test_package -s compiler="Visual Studio" -s compiler.runtime=MDd -s build_type=Debug
$ conan test_package -s compiler="Visual Studio" -s compiler.runtime=MDd -s build_type=Debug -s arch=x86

您可以列出已创建的不同包二进制文件

$ conan search Hello/0.1@memsharded/testing

上传二进制文件

在本地创建包后,您可以将其上传到 Conan 远程服务器。如果您使用原始用户名“memsharded”(来自 git 克隆)创建它,则可能需要执行conan copy将其置于您自己的用户名下。当然,您也可以编辑配方或设置环境变量CONAN_USERNAME来定义您自己的用户名。

另一种方法是在远程配置权限,以允许使用不同用户名上传包。Artifactory 将允许这样做,但默认情况下,conan_server 不会;必须在server.conf[write_permissions]部分中明确提供权限。

$ conan upload Hello/0.1@memsharded/testing --all -r=myserver

重用包

要直接从 Visual Studio 使用现有包,Conan 提供了visual_studio生成器。让我们克隆一个现有的“Chat”项目,该项目包含一个利用先前“Hello World”包的“ChatLib”静态库,以及一个调用“ChatLib”库函数的“MyChat”应用程序。

$ git clone https://github.com/memsharded/chat_vs
$ cd chat_vs

与前面的示例一样,存储库在build文件夹中包含一个 Visual Studio 解决方案。但是,如果您尝试打开它,它将无法加载。这是因为它期望找到一个包含有关依赖项所需信息的文件,因此您必须首先获取该文件。只需运行

$ conan install .

您将看到它创建了两个文件:一个包含当前依赖项配置的conaninfo.txt文件,以及一个包含 Visual Studio 属性(如<AdditionalIncludeDirectories>)的conanbuildinfo.props文件,因此它能够找到已安装的依赖项。

现在您可以打开 IDE 并构建并运行应用程序(顺便说一句,所有聊天功能都只是根据构建类型调用hello()函数两到三次)

$  build\ChatLib\ChatLib.sln
# Switch to Release
# MyChat -> Set as Startup Project
# Ctrl + F5 (Debug -> Run without debugging)
> Hello World Release!
> Hello World Release!

如果您希望链接到 Hello 包的调试版本,只需安装它并更改 IDE 构建类型即可

$ conan install . -s build_type=Debug -s compiler="Visual Studio" -s compiler.runtime=MDd
# Switch to Debug
# Ctrl + F5 (Debug -> Run without debugging)
> Hello World Debug!
> Hello World Debug!
> Hello World Debug!

从使用者项目创建包

现在您可以关闭 IDE 并清理临时文件

# close VS IDE
$ git clean -xdf

同样,存储库中有一个conanfile.py包配方以及一个test_package。该配方与之前的配方几乎相同,但有两个细微的差别

requires = "Hello/0.1@memsharded/testing"
...
generators = "visual_studio"

这将允许我们创建和测试“ChatLib”库的包

$ conan test_package
...
> Hello World Release!
> Hello World Release!

您还可以像上面一样对不同的构建类型和架构重复此过程。ChatLib 库的二进制包也可以上传和共享。

其他配置

以上示例在 VS2017 中“按原样”有效,因为 VS 支持从先前版本升级。tools.msvc_build_command()已经实现了此功能,因此您可以使用 VS2017 构建和测试包。唯一的要求是定义VS150COMNTOOLS环境变量,因为 VS2017 没有定义它,并且需要它来查找工具

# maybe better done system-wide after VS2017 installation
$ set VS150COMNTOOLS C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/Tools
$ conan test_package -s compiler="Visual Studio" -s compiler.version=15

如果需要,您还可以为旧版本的 Visual Studio 构建。在这种情况下,您的构建文件夹中可能会有不同的解决方案项目。然后,该配方只需选择正确的项目,例如

def build(self):
    # assuming HelloLibVS12, HelloLibVS14 subfolders
    sln_file = "build/HelloLibVS%s/HelloLib.sln" % self.settings.compiler.version
    cmd = tools.msvc_build_command(self.settings, sln_file)
    self.run(cmd)

结论

首先,注意一点。目前,visual_studio是一个单配置生成器(即,包包含调试或发布工件,这通常是推荐的方法)。它不支持多配置包(即包含调试和发布工件的包)。如果您需要此功能,请通过在github中提交问题来报告并提供反馈。

Microsoft Windows 和 Visual Studio 一直都是 Conan 中的一等公民。许多 OSS 工具主要是为“nix”类环境创建的,对 Windows 的支持后来作为事后考虑,有时需要使用不方便的解决方法。虽然 Conan 文档和示例主要出于方便起见使用 CMake,但这并不是必需的。这篇博文表明,Conan 可用作纯 Visual Studio 和使用其他构建系统的混合堆栈的包管理器。并且不仅可以从源代码构建,还可以管理和共享 Conan 远程服务器(Artifactory 或 conan_server)中所需尽可能多的配置的二进制文件。

有任何反馈吗?请在@conan_io或通过电子邮件告知我们:info@conan.io