【发布时间】: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 文件以达到相同的目的。我在这里看到两个问题:
- 构建失败,因为项目文件无法加载,因为我没有将 Conan 生成的 .props 文件提交到 repo。这些被认为是临时构建文件。 (你可以在这里改变我的想法,但请看#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