在柯南文档中,我找到了以下页面: https://docs.conan.io/en/latest/howtos/visual_studio_packages.html
此页面分两个示例,一个示例是使用柯南生成.props文件,将Visual Studio IDE指向项目的依赖项,另一个示例创建一个Visual Studio解决方案/项目的程序包,该程序包使用柯南具有依赖性。这两种方法对我来说都是分开工作的,但是将它们组合在一起以能够使用带有Conan依赖项的VS IDE并打包VS解决方案失败,原因如下:
在使用IDE时使用柯南(或VS的柯南扩展名)来处理依赖项时,Visual Studio项目文件(.vcxproj)被修改为包括并导入对柯南生成的.props文件的调用。项目文件是通过Git进行源代码控制的。然后,当在同一conanfile.py上调用conan create
时,我的source
方法将克隆回购到指定标记处。这将包括被告知要导入由柯南生成的构建文件的项目文件,然后conanfile.py中的build
方法将“注入”其自己的.props文件以达到相同的目的。我在这里看到两个问题:
是否有某种方法可以使MSBuild帮助程序(在conanfile.py的build()方法中)使用与conan install
命令生成的.props相同,而不是使用命令时生成的.props在conan create
命令中将arg的行换成msbuild吗?还是比这更好的解决方案?
我试图尽可能清楚一些,但请让我知道是否可以进一步澄清该问题。任何帮助表示赞赏。
下面是一个示例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 Project文件允许您有条件地导入项目。我将它们调整为仅在找到柯南属性表的情况下才导入。这样可以确保在使用上述conanfile.py创建程序包时,克隆的存储库将为msbuild正确加载,然后Conan可以相应地注入依赖项。 Visual Studio的Conan扩展不会覆盖条件,因此您仍然可以运行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专家,可能会有更好的方法来完成上述操作,但这对我有用。
这是一种解决方法。我发现的是在本文开头的柯南how-tos文档中的示例使用“ exports_sources”获取其来源。看起来柯南正确地处理了这种情况,但不是从SCM获取源(使用source()方法)的情况,在我的情况下git克隆了一个特定的标签。我在项目存储库中对此进行了测试,但是对于我们的开发流程,我们更喜欢打包带标签的git commit的功能。
答案 0 :(得分:1)
看看新的“ msbuild”生成器。我发现它解决了我遇到的许多问题,因为它稍微改变了架构。
在顶层,它创建一个conan_deps.props
文件(可以将(?)提交给存储库。
从那里开始,当您执行conan install
时,它将为每个依赖关系创建一个“顶级” .props
文件,并为每个配置在其下方放置单独的.props
文件。 / p>
我发现这样做对我来说要好得多,因为它在我的开发环境中也给了我更大的灵活性。
我现在遇到的唯一问题是VS扩展尚未“正式”更新以支持它...但是我现在仅通过使用嵌入式开发人员命令提示符来解决此问题: )
编辑(11/4/2020):实际上,我在VS扩展存储库中打开了Github issue,开发人员很快就回来了!看起来他们在等待某些情况稳定下来之后才对扩展进行更改。