From 49d359d357b08948175ea0e2e6f8835eeeced024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=98=BF=E9=B9=B0?= Date: Mon, 16 Mar 2026 21:41:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(config):=20=E6=B7=BB=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E8=BF=81=E7=A7=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在配置加载时支持从资源文件迁移缺失的配置节点 - 实现配置节点值和注释的完整迁移 - 支持嵌套section注释的迁移 - 添加缺失节点检测和自动补全机制 - 迁移完成后自动保存到文件并输出调试信息 --- .../module/configuration/ConfigLoader.kt | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/module/basic/basic-configuration/src/main/kotlin/taboolib/module/configuration/ConfigLoader.kt b/module/basic/basic-configuration/src/main/kotlin/taboolib/module/configuration/ConfigLoader.kt index 402060167..441f1fecc 100644 --- a/module/basic/basic-configuration/src/main/kotlin/taboolib/module/configuration/ConfigLoader.kt +++ b/module/basic/basic-configuration/src/main/kotlin/taboolib/module/configuration/ConfigLoader.kt @@ -66,6 +66,10 @@ class ConfigLoader : ClassVisitor(1) { } else { Configuration.loadFromFile(file, concurrent = configAnno.property("concurrent", true)) } + // 迁移 + if (configAnno.property("migrate", false)) { + migrateConfig(name, conf) + } // 赋值 field.set(findInstance(owner), conf) // 自动重载 @@ -97,5 +101,36 @@ class ConfigLoader : ClassVisitor(1) { companion object { val files = HashMap() + + private fun migrateConfig(resourceName: String, conf: Configuration) { + val inputStream = ConfigLoader::class.java.classLoader.getResourceAsStream(resourceName) ?: return + val source = Configuration.loadFromInputStream(inputStream, conf.type) + val sourceKeys = source.getKeys(true) + val targetKeys = conf.getKeys(true) + val missingKeys = sourceKeys - targetKeys + if (missingKeys.isEmpty()) return + // 收集需要迁移注释的 section 路径 + val sectionPaths = LinkedHashSet() + missingKeys.forEach { key -> + // 迁移值 + conf[key] = source[key] + // 迁移叶子节点注释 + source.getComment(key)?.let { conf.setComment(key, it) } + // 收集父级 section 路径 + var path = key + while (path.contains('.')) { + path = path.substringBeforeLast('.') + sectionPaths += path + } + } + // 迁移 section 注释(仅当目标配置中该 section 之前不存在时) + sectionPaths.forEach { path -> + if (conf.getComment(path) == null) { + source.getComment(path)?.let { conf.setComment(path, it) } + } + } + conf.saveToFile() + PrimitiveIO.debug("配置文件迁移完成,补全了 ${missingKeys.size} 个缺失节点: $resourceName") + } } } \ No newline at end of file