50+VS项目迁移至Conan 1.x的依赖管理方案咨询
Visual Studio多项目迁移Conan 1.x的实操方案
针对你提到的三个核心问题,结合Conan 1.x的特性,给出以下落地解决方案:
1. 全局统一管理公共依赖的版本与变体
方案一:基础Conanfile继承
在项目根目录MainDir创建一个base_conanfile.py,集中定义公共依赖的版本、编译选项:
from conans import ConanFile class BaseConan(ConanFile): # 公共依赖版本,统一修改此处即可 BOOST_VERSION = "1.78.0" GTEST_VERSION = "1.11.0" def requirements(self): # 可根据项目类型选择性添加,或让子类重写 self.requires(f"boost/{self.BOOST_VERSION}") self.requires(f"gtest/{self.GTEST_VERSION}") def configure(self): # 统一公共依赖的编译变体 self.options["boost"].shared = True self.options["gtest"].shared = False
每个项目的conanfile.py直接继承这个基类,按需添加独有依赖:
from conans import ConanFile from base_conanfile import BaseConan class Exe1Conan(BaseConan): def requirements(self): super().requirements() # 添加当前项目独有的依赖 self.requires("some_unique_lib/1.0.0")
方案二:全局Profile统一变体
在项目根目录创建profiles文件夹,比如profiles/vs2019_debug_x64:
[settings] os=Windows compiler=msvc compiler.version=16 compiler.toolset=v142 arch=x86_64 build_type=Debug [options] boost:shared=True gtest:shared=False
所有项目执行conan install时指定此Profile,确保编译变体完全一致:
conan install . --profile=../profiles/vs2019_debug_x64
2. 自动复制依赖DLL到指定输出目录
利用Conan的imports机制,在项目的conanfile.py中定义DLL复制规则,可根据编译类型动态匹配:
from conans import ConanFile from base_conanfile import BaseConan class Exe1Conan(BaseConan): # 根据build_type自动选择目标目录 def imports(self): build_type = self.settings.build_type arch = "64" if self.settings.arch == "x86_64" else "" dst_dir = f"../../{build_type}{arch}Dlls" # 复制所有依赖的DLL到目标输出目录 self.copy("*.dll", dst=dst_dir, src="bin", keep_path=False) # 可选:复制PDB文件用于调试 self.copy("*.pdb", dst=dst_dir, src="bin", keep_path=False)
执行conan install时,Conan会自动将依赖的DLL复制到对应DebugDlls/Release64Dlls等目录。
3. 批量执行多项目的conan install
Conan 1.x没有直接类似CMake add_subdirectory的内置批量执行机制,但可以通过以下方式简化:
方案一:使用Conan Workspace
在MainDir创建conanws.yml,列出所有需要管理的项目:
workspace: folders: - Libraries/lib1 - Libraries/lib2 - Executables/exe1 - Executables/exe2 # 依次添加所有50+项目
然后在MainDir执行:
conan install . --profile=profiles/vs2019_debug_x64
Conan会自动遍历workspace中定义的所有项目目录,执行conan install操作,无需逐个手动执行。
方案二:轻量脚本遍历
如果workspace不符合需求,可编写简单的PowerShell脚本(适用于Windows)run_conan_install.ps1:
$profile = "profiles/vs2019_debug_x64" # 遍历Libraries下的所有项目 Get-ChildItem -Path ./Libraries -Directory | ForEach-Object { if (Test-Path "$($_.FullName)/conanfile.py") { Write-Host "Running conan install on $($_.Name)" Push-Location $_.FullName conan install . --profile=../../$profile Pop-Location } } # 遍历Executables下的所有项目 Get-ChildItem -Path ./Executables -Directory | ForEach-Object { if (Test-Path "$($_.FullName)/conanfile.py") { Write-Host "Running conan install on $($_.Name)" Push-Location $_.FullName conan install . --profile=../../$profile Pop-Location } }
执行脚本即可批量完成所有项目的依赖安装,脚本可根据实际需求调整(比如支持不同Profile切换)。
内容的提问来源于stack exchange,提问作者Mikołaj Milej
相关产品推荐
相关产品推荐

