conan默认将依赖包统一缓存至全局目录(linux/macos为~/.conan2,windows为c:\users\.conan2),不随项目删除而丢失;可用conan search查本地缓存、conan remove或conan cache clean --all清理,切勿手动删目录。

Conan 默认就在本地缓存依赖包,不需要额外配置 —— 但你得知道它缓存在哪、怎么查、怎么清理,否则容易误以为“没缓存”或“重复下载”。
conan install 后的包到底存在哪儿?
Conan 会把所有下载或构建出的包(含源码、头文件、库、配置)统一存到本地缓存目录,路径默认是 ~/.conan2(Linux/macOS)或 C:\Users\<user>\.conan2</user>(Windows)。这个目录不是项目内子目录,而是全局唯一的。
- 不要手动修改或删除该目录下的文件,可能破坏缓存一致性
-
conan install命令只要成功执行过一次,后续相同requires+ 相同settings(如os=Linux,compiler=gcc,build_type=Release)就会直接复用缓存,不重新下载 - 不同 profile 或不同
build_type会生成不同缓存条目 —— 比如Debug和Release的 zlib 是两个独立缓存项
怎么确认某个包是否已在本地缓存?
用 conan search 查,不是看文件系统。直接运行:
conan search "zlib/*"
会列出所有已缓存的 zlib 版本;加具体版本更精准:
conan search "zlib/1.2.13@"
- 如果返回空,说明没缓存(或没匹配到);不是网络问题,先检查拼写和 @ 符号
-
conan search不联网,只查本地缓存,响应极快 - 注意:Conan 2.x 默认不显示 channel(如
@后面部分),但缓存实际仍按完整 ref 存储,zlib/1.2.13@和zlib/1.2.13@user/channel是不同缓存项
为什么 conan install 还在下载,明明之前装过?
常见原因不是缓存失效,而是「缓存没命中」:
- profile 不一致:比如上次用
defaultprofile(含compiler.version=12),这次用自定义 profile 里写了compiler.version=11→ 视为全新配置,缓存不复用 - conanfile.txt 或 conanfile.py 里
requires写了模糊版本(如fmt/^10.0.0),每次 resolve 可能选不同 patch 版本,导致缓存未命中 - 用了
--build=missing但远程有预编译二进制,却因settings.compiler.libcxx(如libstdc++11vslibc++)不匹配而跳过缓存,转为源码构建 - 执行
conan install的目录下没有conanfile.txt或conanfile.py,Conan 会 fallback 到全局缓存查询逻辑,但不会自动应用你的项目声明
如何安全清理缓存?
别直接删 .conan2 文件夹。用命令:
conan remove "zlib/*" --confirm
或按 ref 精确清除:
conan remove "zlib/1.2.13@" --confirm
-
--confirm参数必须加,否则只是预览不执行 - 清除后,下次
conan install遇到该包会重新下载或构建,但不会影响其他包 - 想清空全部缓存(慎用):
conan cache clean --all,这会清掉所有包、配置、下载记录
最常被忽略的一点:缓存内容本身不包含 build log 或临时中间文件,那些在 build 目录下,和 Conan 缓存无关 —— 别混淆两者位置。











