【问题标题】:How can I use Conan to both provide dependencies for the Visual Studio IDE and create a package of the same project, again using Conan dependencies?如何使用柯南为 Visual Studio IDE 提供依赖项并创建同一项目的包,再次使用柯南依赖项?
【发布时间】:2020-06-25 17:50:16
【问题描述】:

在柯南的文档中,我找到了这个页面: https://docs.conan.io/en/latest/howtos/visual_studio_packages.html

本页介绍了 2 个示例,一个是使用 Conan 生成一个 .props 文件以将 Visual Studio IDE 指向您的项目的依赖项,另一个是创建一个 Visual Studio 解决方案/项目的包有使用柯南的依赖关系。这两个对我来说都是单独工作的,但是将它们结合起来就能够使用带有柯南依赖项的 VS IDE 并打包 VS 解决方案失败,原因如下:

在使用 IDE 的同时使用 Conan(或 VS 的 Conan 扩展)处理依赖项时,Visual Studio 项目文件 (.vcxproj) 被修改为包含和导入对 Conan 生成的 .props 文件的调用。项目文件通过 Git 进行源代码控制。然后在同一个 conanfile.py 上调用 conan create 时,我的 source 方法会在指定标记处克隆 repo。这将包括被告知导入柯南生成的构建文件的项目文件,然后 conanfile.py 中的build 方法将“注入”它自己的 .props 文件以达到相同的目的。我在这里看到两个问题:

  1. 构建失败,因为项目文件无法加载,因为我没有将 Conan 生成的 .props 文件提交到 repo。这些被认为是临时构建文件。 (你可以在这里改变我的想法,但请看#2)
  2. 即使我将 Conan 生成的 props 提交到 repo,然后它们将被克隆并允许 msbuild 加载项目文件,然后 Conan msbuild 帮助程序正在尝试加载它自己的依赖项,这将导致双重定义的符号和其他问题。

有没有办法让 MSBuild 帮助程序(在 conanfile.py 的 build() 方法中)使用与使用命令行 arg 时由 conan install 命令生成的相同的 .props 而不是它自己将 msbuild 作为conan create 命令的一部分?还是比这更好的解决方案?

我试图尽可能清楚,但如果我能进一步澄清这个问题,请告诉我。任何帮助表示赞赏。

下面是一个示例 conanfile.py 尝试完成此操作:

from conans import ConanFile, MSBuild, tools
from conans.tools import load, save
import re, os

class TestConan(ConanFile):
    name = "test"
    version = "1.1.2"
    settings = "os", "compiler", "build_type", "arch"
    generators = "visual_studio_multi", "visual_studio"
    requires = "snappy/1.1.8", "boost/1.73.0", "rapidjson/1.1.0"
    options = {"shared": [True, False]}
    default_options = {"shared": True, "boost:shared" : "True", "snappy:shared" : "True"}

    def source(self):
        git = tools.Git(folder=self.name)
        git.clone("http://path/to/test/repo/testrepo.git", branch="1.1.2")

    def build(self):
        msbuild = MSBuild(self)
        msbuild.build("testrepo/testrepo.sln", platforms={"x86":"Win32"}, upgrade_project=False)

    def package(self):
        self.copy("*.h", dst="include/testrepo", src="testrepo")
        self.copy("*.hpp", dst="include/testrepo", src="testrepo")
        self.copy("*.lib", dst="lib", keep_path=False)
        self.copy("*.dll", dst="bin", keep_path=False)

    def package_info(self):
        self.cpp_info.libs = ["test"]
        self.cpp_info.includedirs = ["include"]
        self.cpp_info.bindires = ["bin"]
        self.cpp_info.libdirs = ["lib"]

编辑:潜在的解决方法

Visual Studio 项目文件允许您有条件地导入项目。我将它们调整为仅在找到柯南属性表时才导入。这使得当使用上面的 conanfile.py 创建包时,克隆的 repo 将正确加载 msbuild,然后 Conan 可以相应地注入依赖项。 Visual Studio 的柯南扩展不会覆盖这些条件,因此您仍然可以运行 conan install 并使用 IDE 进行开发,然后清理临时构建文件(属性表)并提交。就我而言,我只是将扩展创建的 .conan 文件夹添加到 .gitignore。

解决方法的示例代码:

  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project=".conan\conanbuildinfo.props" Condition="exists('.conan\conanbuildinfo.props')" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project=".conan\conanbuildinfo.props" Condition="exists('.conan\conanbuildinfo.props')" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <Import Project=".conan\conanbuildinfo.props" Condition="exists('.conan\conanbuildinfo.props')" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Import Project=".conan\conanbuildinfo.props" Condition="exists('.conan\conanbuildinfo.props')" />
  </ImportGroup>

警告:我不是项目文件 xml 专家,可能有更好的方法来完成与上述相同的操作,但这对我有用。

这是一种解决方法。我发现的是本文开头的柯南操作指南文档中的示例使用“exports_sources”获取其来源。似乎柯南正确处理了这种情况,但不是您从 SCM 获取源(使用 source() 方法)的情况,在我的情况下是 git 克隆特定标签。我用我的项目 repo 对此进行了测试,但对于我们的开发流程,我们更喜欢打包带标记的 git commit 的能力。

【问题讨论】:

  • 嗨!我不确定什么可能会失败。但是 MSBuild() 不会再次为依赖项注入生成的 *.props 文件,它们不应该被复制。 docs.conan.io/en/latest/howtos/visual_studio_packages.html 中的代码位于 2 个 repos 中,例如 github.com/memsharded/chat_vs。也许值得有一些命令可以根据该 repo 重现问题并将其提交到:github.com/conan-io/conan/issues
  • @drodri 好主意,我将使用 chat_vs 创建一个示例,看看问题是否被复制。如果是这样,我将提交一个问题。同时,对于我的具体项目,我找到了一种解决方法,我将在此问题的回答帖子中详细说明。

标签: visual-studio packaging conan


【解决方案1】:

看看新的“msbuild”生成器。我发现它解决了我遇到的很多问题,因为它稍微改变了架构。

在顶层,它会创建一个 conan_deps.props 文件(可以(?)提交到 repo。

从那里开始,当您执行 conan install 时,它会为每个依赖项创建一个“顶级”.props 文件,并在其下方为每个配置创建一个单独的 .props 文件。

我发现这对我来说效果更好,因为它也为我的开发环境提供了更大的灵活性。

我现在唯一遇到的问题是 VS 扩展尚未“正式”更新以支持它......但我现在通过简单地使用嵌入式开发人员命令提示符解决了这个问题: )

编辑(2020 年 11 月 4 日):我实际上在 VS 扩展存储库中打开了一个 Github issue,开发人员很快就回来了!看起来他们正在等待事情稳定下来,然后再对扩展进行更改。

【讨论】:

  • 很抱歉直到今天早上我才看到这个。我只是尝试使用 msbuild 生成器逐步完成我们的一个示例项目,然后 conan 输出一条通知,表明它已被弃用并改用 MSBuildDeps。使用 MSBuildDeps 时,我确实注意到 .props 文件中的顶级导入语句使用了我在上面的解决方法/解决方案中使用的条件。感谢您的建议,我将看看切换到此生成器是否对我们的项目有意义。不过,我更希望改进 Visual Studio 特定的生成器,因为我们希望主要基于 IDE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多