|
3 | 3 | // 入口:解析参数 → 加载配置 → 获取命名空间(全量/增量) |
4 | 4 | // → 按策略展开 Provider → 合并 → 替换 → 写 ZIP → MD5 |
5 | 5 | // ============================================================ |
6 | | - |
| 6 | + |
7 | 7 | // -- 参数解析 ------------------------------------------------------------------ |
8 | 8 | var versionOpt = new Option<string>("--version", "--v"); |
9 | 9 | var incrementOpt = new Option<bool>("--increment", "--i"); |
|
49 | 49 | // 其他类型冲突时保留第一个,打出警告 |
50 | 50 | var merged = allProviders.Select(group => |
51 | 51 | { |
52 | | - if (!group.Skip(1).Any()) return group.First(); |
53 | | - if (group.All(p => p is KVPFile)) |
| 52 | + if (!group.Skip(1).Any()) |
| 53 | + return group.First(); |
| 54 | + if (group.All(p => p is TextFile)) |
54 | 55 | { |
55 | | - var r = group.Cast<KVPFile>().Aggregate((a, n) => a.Merge(n)); |
56 | | - if (r is ResourceFileProvider rfp) |
57 | | - rfp.Namespace = group.Cast<KVPFile>().First().Namespace; |
58 | | - return r; |
| 56 | + TextFile result = group.All(p => p is KVPFile) |
| 57 | + ? group.Cast<KVPFile>().Aggregate((a, n) => a.Merge(n)) |
| 58 | + : group.Cast<TextFile>().Aggregate((a, n) => a.Merge(n)); |
| 59 | + result.Namespace = ((ResourceFileProvider)group.First()).Namespace; |
| 60 | + return result; |
59 | 61 | } |
60 | 62 | Log.Warning("Destination 冲突但无法合并: {Dest}, 保留第一个", group.Key); |
61 | 63 | return group.First(); |
|
76 | 78 | // -- 写入 ZIP ----------------------------------------------------------------- |
77 | 79 | var packName = $"./Minecraft-Mod-Language-Modpack-{config.Base.Version}.zip"; |
78 | 80 | await using var stream = File.Create(packName); |
| 81 | +var destReplacements = config.Floating.DestinationReplacement |
| 82 | + .ToDictionary(kv => new Regex(kv.Key), kv => kv.Value); |
| 83 | + |
79 | 84 | using (var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true)) |
80 | 85 | { |
81 | 86 | foreach (var p in merged.Concat(initialFiles)) |
82 | 87 | { |
| 88 | + var dest = p.Destination; |
| 89 | + foreach (var (pattern, replacement) in destReplacements) |
| 90 | + { |
| 91 | + dest = pattern.Replace(dest, replacement); |
| 92 | + } |
| 93 | + |
83 | 94 | using var content = p.GetContentStream(); |
84 | | - var entry = archive.CreateEntry(p.Destination); |
| 95 | + var entry = archive.CreateEntry(dest); |
85 | 96 | using var es = entry.Open(); |
86 | 97 | await content.CopyToAsync(es); |
87 | 98 | } |
|
0 commit comments