Bigtop 多版本编译源码改造(一)1.0.7+
# 背景说明
在使用 Bigtop 构建 RPM 包时,默认的构建逻辑无法很好地支持多版本补丁归档管理。我们希望通过一种更结构化的方式,对源码补丁进行按版本隔离归档,并在构建过程中自动识别和注入。
在不破坏原有构建逻辑的前提下Patch机制 ,增强其兼容性与扩展性,是此次改造的重点。
# 原始构建逻辑回顾
在 packages.gradle
中,源码文件默认会被统一复制到 SOURCES
目录,核心逻辑如下:
copy {
from fileTree("$BASE_DIR/bigtop-packages/src/common/$NAME") {
include '**/*'
}
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
1
2
3
4
5
6
2
3
4
5
6
原始问题
这种统一处理的方式,虽然简洁,但不利于管理多个版本的差异化补丁,版本迭代中容易导致补丁混淆与冲突。
# 改造目标与方案设计
为了更好地支撑如下场景,我们对 packages.gradle
的处理逻辑进行了增强:
需求 | 描述 |
---|---|
多版本隔离 | 支持按照 BASE_VERSION 将补丁文件归档至子目录 |
自动注入 | 在构建时自动识别是否存在版本目录,并注入对应补丁 |
向下兼容 | 保留原始路径逻辑,确保未改造组件不受影响 |
如图所示,改造后的目录结构中,补丁按版本划分:
# 修改后的代码逻辑
我们在 packages.gradle
中加入如下逻辑:
def baseCommonDir = "$BASE_DIR/bigtop-packages/src/common/$NAME"
def versionCommonDir = "$baseCommonDir/${BASE_VERSION}"
println "Copying common RPM SOURCES from: $baseCommonDir (excluding $BASE_VERSION) to $PKG_BUILD_DIR/rpm/SOURCES"
// 1. 复制根目录通用文件(非版本相关)
copy {
from fileTree(baseCommonDir) {
include '**/*'
exclude "${BASE_VERSION}/**"
}
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
// 2. 如果存在版本特定目录,注入版本补丁
if (new File(versionCommonDir).exists()) {
println "Copying version-specific RPM SOURCES from: $versionCommonDir to $PKG_BUILD_DIR/rpm/SOURCES"
copy {
from fileTree(versionCommonDir) {
include '**/*'
}
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
} else {
println "No version-specific directory found at: $versionCommonDir"
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
提示
这段逻辑保证了默认行为的稳定性,同时允许我们在特定版本目录中增加补丁内容,从而实现对每个版本的精细化管理。
# 差异
差异如下图所示