conan 的导入/导出 为 离线环境作业

检查脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[root@rk3528-openeuler22 conan]# cat ./check_conan.sh
#!/usr/bin/env bash
# 检查 Conan 缓存中每个包的状态(直接查 sqlite3 + 文件系统)
set -euo pipefail

CONAN_HOME="${CONAN_HOME:-$HOME/.conan2}"
DB="$CONAN_HOME/p/cache.sqlite3"
P="$CONAN_HOME/p"

# 收集所有 tool_requires 引用
tool_pkgs=$(grep -rh 'tool_requires\s*(' "$P"/*/e/conanfile.py 2>/dev/null \
| grep -oP '[\w.+-]+/[\w.+-]+@[\w.+-]+/[\w.+-]+' | sort -u || true)

# packages 表:reference -> "hash1 hash2 ..."
declare -A pkg_hashes
while IFS='|' read -r ref hash; do
pkg_hashes["$ref"]+="$hash "
done < <(sqlite3 "$DB" "SELECT reference, path FROM packages;" 2>/dev/null || true)

echo "src:s=源码 es=补丁 bin=已编译二进制 bld=编译中间产物 R=Release D=Debug tool=被其他包用作构建工具"
echo ""
total=0; no_src=0

while IFS='|' read -r pkg recipe_hash; do
(( total++ )) || true

# --- src ---
have_s=false; have_es=false
[[ -d "$P/$recipe_hash/s" ]] && have_s=true
[[ -d "$P/$recipe_hash/es" ]] && have_es=true
if $have_s && $have_es; then src="s+es"
elif $have_s; then src="s "
elif $have_es; then src="es "
else src=" "; (( no_src++ )) || true
fi

# --- bin / bld(带 Release/Debug 标记)---
bin_r=false; bin_d=false; bld_r=false; bld_d=false
for h in ${pkg_hashes["$pkg"]:-}; do
bt=$(grep -m1 '^build_type=' "$P/$h/p/conaninfo.txt" 2>/dev/null | cut -d= -f2 || true)
[[ "$bt" == "Release" ]] && [[ -d "$P/$h/p" ]] && bin_r=true
[[ "$bt" == "Debug" ]] && [[ -d "$P/$h/p" ]] && bin_d=true
[[ "$bt" == "Release" ]] && [[ -d "$P/$h/b" ]] && bld_r=true
[[ "$bt" == "Debug" ]] && [[ -d "$P/$h/b" ]] && bld_d=true
done

# 格式:bin[R][D] / bld[R][D]
bin=""; $bin_r && bin+="R" || bin+="-"; $bin_d && bin+="D" || bin+="-"
bld=""; $bld_r && bld+="R" || bld+="-"; $bld_d && bld+="D" || bld+="-"
[[ "$bin" == "--" ]] && bin=" " || true
[[ "$bld" == "--" ]] && bld=" " || true

# --- tool ---
echo "$tool_pkgs" | grep -qF "${pkg%%#*}" && tool="tool" || tool=" "

[[ -n "${src// /}" ]] && sym="✔" || sym="✘"
echo "$sym [src:${src}] [bin:${bin}] [bld:${bld}] [${tool}] $pkg"

done < <(sqlite3 "$DB" "SELECT reference, path FROM recipes ORDER BY reference;")

echo ""
echo "总计: $total 缺源码: $no_src"
[root@rk3528-openeuler22 conan]#

运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@rk3528-openeuler22 conan]# ./check_conan.sh
src:s=源码 es=补丁 bin=已编译二进制 bld=编译中间产物 R=Release D=Debug tool=被其他包用作构建工具

✔ [src:s ] [bin: ] [bld: ] [ ] b2/5.2.0@tool/none
✔ [src:s+es] [bin:R-] [bld:R-] [tool] bison/3.8.2@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] boost/1.86.0@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] cjson/1.7.15@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [tool] flex/2.6.4@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] gtest/1.10.0@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] hiredis/1.2.0@opensrc/none
✔ [src:s ] [bin:R-] [bld:R-] [ ] iniparser/4.2.6@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] jsoncpp/1.9.6@opensrc/none
✔ [src:s+es] [bin: ] [bld: ] [ ] libdpdk/22.11.4@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] libevent/2.1.12@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] libmaxminddb/1.12.2@opensrc/none
✔ [src:s ] [bin:R-] [bld:R-] [ ] libpcap/1.10.4@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] libyasdxwatch/1.4.0@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [ ] libyv_sub/1.0.2@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [tool] m4/1.4.19@opensrc/none
✔ [src:s ] [bin: ] [bld: ] [ ] mongoose/7.1@opensrc/yview
✔ [src:s ] [bin:R-] [bld:R-] [ ] muduo/recipe-cpp11@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] myhtml/4.0.5@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] sdx_rdkafka/0.0.3@yview/master
✔ [src:s ] [bin: ] [bld: ] [ ] simde/0.8.2@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] tcp_rsm/1.0.3@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [ ] vectorscan/5.4.11@opensrc/none
✔ [src:s ] [bin:R-] [bld:R-] [ ] vmime/1.0.0@opensrc/none
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yabasicutils/0.2.5@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yaclibs/1.0.0@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yaemail/0.0.19@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yaftypes/0.3.9@yview/master
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yapdl/1.0.1@yview/fastsdt
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yaprotorecord/0.4.9@yview/master
✔ [src:es ] [bin:R-] [bld: ] [ ] yasdt/1.2.9@yview/fastsdt_patch
✔ [src:s+es] [bin:R-] [bld:R-] [ ] yasdtacl/1.0.1@yview/master

总计: 32 缺源码: 0
[root@rk3528-openeuler22 conan]#

导出脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@rk3528-openeuler22 conan]# cat pack_sources.sh
#!/usr/bin/env bash
# 导出 Conan 缓存中所有包的 recipe + 源码,不含编译二进制
# 用法: bash pack_sources.sh [输出文件名]
# 导入: conan cache restore <文件名>
set -euo pipefail

OUTPUT="${1:-conan_sources_$(date +%Y%m%d_%H%M%S).tgz}"

echo ">>> 检查源码完整性..."
missing=()
while IFS= read -r pkg; do
src=$(conan cache path --folder source "$pkg" 2>&1) || true
if echo "$src" | grep -q "does not exist"; then
missing+=("$pkg")
fi
done < <(conan list "*" --format json 2>/dev/null \
| python3 -c "import json,sys; [print(p) for p in json.load(sys.stdin).get('Local Cache',{})]")

if [[ ${#missing[@]} -gt 0 ]]; then
echo "警告: 以下包缺少源码,导入后需联网执行 conan source 补全:"
for pkg in "${missing[@]}"; do
echo " - $pkg"
done
echo ""
fi

# "*" 只匹配 recipe,不含 ":package_id",所以不会打包编译二进制
echo ">>> 打包中(recipe + 源码,无二进制)..."
conan cache save "*" --file "$OUTPUT"

SIZE=$(du -sh "$OUTPUT" | cut -f1)
echo ""
echo "===== 打包完成 ====="
echo "文件: $OUTPUT ($SIZE)"
echo ""
echo "目标机器导入命令:"
echo " conan cache restore $OUTPUT"
[root@rk3528-openeuler22 conan]#

开始导出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
进入你本地包含 conanfile.txt 或 conanfile.py 的项目目录

cd sdx_dpi_sdt


# 核心命令:强行激活依赖包的源码下载开关
conan graph info . -c tools.build:download_source=True

作为工具使用 而不是 API库的这类 顽固,上述命令拉不下来
conan source b2/5.2.0@tool/none
conan source bison/3.8.2@opensrc/none


只导出配方和源码
conan cache save "*" --file "$OUTPUT"

导入到离线机

1
2
3
4
5
6
7
8
9
10
conan cache restore $OUTPUT

禁止联网 nexus
conan remote disable "*" # 离线时禁用
conan remote enable "*" # 联网时恢复

禁止联网 yum
~/.conan2/global.conf
-tools.system.package_manager:mode=install
+tools.system.package_manager:mode=report

其他 重要 命令

1
2
3
4
5
删除 Conan 本地缓存中所有库的“二进制包”,强制重新编译
conan remove "*:*" --confirm

删除libdpdk 编译出的二进制
conan remove "libdpdk/22.11.4@opensrc/none:*" -c