From 68676cf8abac6573433bbc2687ad6833198ce6bc Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 11 Oct 2021 15:43:51 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=88=A0=E9=99=A4=E3=80=91=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20cfg=20--export=5Ftest=5Fdata=20=E9=80=89=E9=A1=B9?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=83=B3=E4=B8=8D=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=95=B0=E6=8D=AE=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20--export=5Fexclude=5Ftags=20test=20=E3=80=90=E7=89=B9?= =?UTF-8?q?=E6=80=A7=E3=80=91=E6=96=B0=E5=A2=9E=20cfg=20--export=5Fexclude?= =?UTF-8?q?=5Ftags=E9=80=89=E9=A1=B9=EF=BC=8C=E6=94=AF=E6=8C=81=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=8C=87=E5=AE=9Atags=E5=88=97=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +-- docs/images/examples/c_11.jpg | Bin 32870 -> 37549 bytes .../Source/DataSources/AbstractDataSource.cs | 2 +- .../DataSources/Binary/BinaryDataSource.cs | 2 +- .../Source/DataSources/DataSourceFactory.cs | 4 +-- .../DataSources/Excel/ExcelDataSource.cs | 2 +- .../Source/DataSources/Json/JsonDataSource.cs | 2 +- .../Source/DataSources/Lua/LuaDataSource.cs | 2 +- .../Source/DataSources/Xml/XmlDataSource.cs | 2 +- .../Source/DataSources/Yaml/YamlDataSource.cs | 2 +- src/Luban.Job.Cfg/Source/Datas/Record.cs | 9 ++++- src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs | 12 +++---- src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs | 33 +++++++++--------- src/Luban.Job.Cfg/Source/GenArgs.cs | 7 ++-- src/Luban.Job.Cfg/Source/JobController.cs | 5 +-- .../Source/Utils/DataLoaderUtil.cs | 19 +++++----- src/Luban.Job.Cfg/Source/Utils/DataUtil.cs | 19 ++-------- src/Luban.Job.Cfg/Source/ValidatorContext.cs | 18 +++++----- src/Luban.Job.Cfg/Source/l10n/TextTable.cs | 2 +- 19 files changed, 67 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 5de5ac9..2a32094 100644 --- a/README.md +++ b/README.md @@ -221,9 +221,9 @@ array与list类型都能表示列表,它们区别在于array生成的代码为 - 表级别分组 - 字段级别分组(任意bean字段粒度,而不仅限于顶层字段) -### 数据标签 +### 数据标签过滤 -开发期有时候希望临时注释掉一些记录,另外开发期经常会制作一些仅供开发使用的配置,比如测试道具,比如自动化测试使用的配置,在正式上线时不导出这些数据。 luban支持数据标签及数据注释及测试数据过滤导出,导出正式配置时不需要手动将测试数据删掉。 +开发期经常会制作一些仅供开发使用的配置,比如测试道具,比如自动化测试使用的配置,希望在正式发布时不导出这些数据。 ![pipeline](docs/images/examples/c_11.jpg) diff --git a/docs/images/examples/c_11.jpg b/docs/images/examples/c_11.jpg index 5de9c5f7d17e56947895b09b237b5e3fefde1440..442919e6df2639dc715da52de9c1122aff124783 100644 GIT binary patch literal 37549 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 ReadMulti(TBean type); - public abstract void Load(string rawUrl, string sheetName, Stream stream, bool exportDebugData); + public abstract void Load(string rawUrl, string sheetName, Stream stream); } } diff --git a/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs index 2e3407a..6cdfe6c 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Binary/BinaryDataSource.cs @@ -8,7 +8,7 @@ namespace Luban.Job.Cfg.DataSources.Binary { class BinaryDataSource : AbstractDataSource { - public override void Load(string rawUrl, string sheetName, Stream stream, bool exportDebugData) + public override void Load(string rawUrl, string sheetName, Stream stream) { throw new NotImplementedException(); } diff --git a/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs b/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs index e9f6c4a..bbe881a 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/DataSourceFactory.cs @@ -18,7 +18,7 @@ namespace Luban.Job.Cfg.DataSources ".bin", }; - public static AbstractDataSource Create(string url, string sheetName, Stream stream, bool exportTestData) + public static AbstractDataSource Create(string url, string sheetName, Stream stream) { try { @@ -36,7 +36,7 @@ namespace Luban.Job.Cfg.DataSources case "yml": source = new Yaml.YamlDataSource(); break; default: throw new Exception($"不支持的文件类型:{url}"); } - source.Load(url, sheetName, stream, exportTestData); + source.Load(url, sheetName, stream); return source; } catch (DataCreateException) diff --git a/src/Luban.Job.Cfg/Source/DataSources/Excel/ExcelDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Excel/ExcelDataSource.cs index 3272bb1..6d38dda 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Excel/ExcelDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Excel/ExcelDataSource.cs @@ -33,7 +33,7 @@ namespace Luban.Job.Cfg.DataSources.Excel } } - public override void Load(string rawUrl, string sheetName, Stream stream, bool exportTestData) + public override void Load(string rawUrl, string sheetName, Stream stream) { s_logger.Trace("{filename} {sheet}", rawUrl, sheetName); RawUrl = rawUrl; diff --git a/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs index 9d09fd7..70ceaf7 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs @@ -14,7 +14,7 @@ namespace Luban.Job.Cfg.DataSources.Json { JsonElement _data; - public override void Load(string rawUrl, string sheetName, Stream stream, bool exportDebugData) + public override void Load(string rawUrl, string sheetName, Stream stream) { RawUrl = rawUrl; this._data = JsonDocument.Parse(stream).RootElement; diff --git a/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs index f59030d..ea05fc4 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs @@ -17,7 +17,7 @@ namespace Luban.Job.Cfg.DataSources.Lua private LuaGlobal _env; private LuaTable _dataTable; - public override void Load(string rawUrl, string sheetName, Stream stream, bool exportDebugData) + public override void Load(string rawUrl, string sheetName, Stream stream) { RawUrl = rawUrl; _env = LuaManager.CreateEnvironment(); diff --git a/src/Luban.Job.Cfg/Source/DataSources/Xml/XmlDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Xml/XmlDataSource.cs index 534b559..007c221 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Xml/XmlDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Xml/XmlDataSource.cs @@ -14,7 +14,7 @@ namespace Luban.Job.Cfg.DataSources.Xml { private XElement _doc; - public override void Load(string rawUrl, string sheetName, Stream stream, bool exportDebugData) + public override void Load(string rawUrl, string sheetName, Stream stream) { RawUrl = rawUrl; _doc = XElement.Load(stream); diff --git a/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs index 5e94b55..e7bf986 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs @@ -13,7 +13,7 @@ namespace Luban.Job.Cfg.DataSources.Yaml class YamlDataSource : AbstractDataSource { private YamlMappingNode _root; - public override void Load(string rawUrl, string sheetName, Stream stream, bool exportDebugData) + public override void Load(string rawUrl, string sheetName, Stream stream) { var ys = new YamlStream(); ys.Load(new StreamReader(stream)); diff --git a/src/Luban.Job.Cfg/Source/Datas/Record.cs b/src/Luban.Job.Cfg/Source/Datas/Record.cs index ac023de..ef4b84f 100644 --- a/src/Luban.Job.Cfg/Source/Datas/Record.cs +++ b/src/Luban.Job.Cfg/Source/Datas/Record.cs @@ -13,7 +13,14 @@ namespace Luban.Job.Cfg.Datas public int Index { get; set; } - public bool IsTest => Tags != null && DataUtil.IsTestTag(Tags); + public bool IsNotFiltered(List excludeTags) + { + if (Tags == null) + { + return true; + } + return Tags.TrueForAll(t => !excludeTags.Contains(t)); + } public Record(DBean data, string source, List tags) { diff --git a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs index 0545f17..f35962d 100644 --- a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs +++ b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs @@ -478,7 +478,7 @@ namespace Luban.Job.Cfg.Defs } }) { - AssemblyBase = new DefAssembly("", null, true, Agent), + AssemblyBase = new DefAssembly("", null, new List(), Agent), }; defTableRecordType.PreCompile(); defTableRecordType.Compile(); @@ -489,7 +489,7 @@ namespace Luban.Job.Cfg.Defs { var source = new ExcelDataSource(); var bytes = await this.Agent.GetFromCacheOrReadAllBytesAsync(file.ActualFile, file.MD5); - var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true, false); + var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true); foreach (var r in records) { DBean data = r.Data; @@ -544,7 +544,7 @@ namespace Luban.Job.Cfg.Defs } }) { - AssemblyBase = new DefAssembly("", null, true, Agent), + AssemblyBase = new DefAssembly("", null, new List(), Agent), }; defTableRecordType.PreCompile(); defTableRecordType.Compile(); @@ -555,7 +555,7 @@ namespace Luban.Job.Cfg.Defs { var source = new ExcelDataSource(); var bytes = await this.Agent.GetFromCacheOrReadAllBytesAsync(file.ActualFile, file.MD5); - var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true, false); + var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true); PEnum curEnum = null; foreach (var r in records) @@ -599,7 +599,7 @@ namespace Luban.Job.Cfg.Defs var inputFileInfos = await DataLoaderUtil.CollectInputFilesAsync(this.Agent, this._importExcelBeanFiles, dataDir); - var ass = new DefAssembly("", null, true, Agent); + var ass = new DefAssembly("", null, new List(), Agent); var defBeanFieldType = new DefBean(new CfgBean() { @@ -669,7 +669,7 @@ namespace Luban.Job.Cfg.Defs { var source = new ExcelDataSource(); var bytes = await this.Agent.GetFromCacheOrReadAllBytesAsync(file.ActualFile, file.MD5); - var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true, false); + var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true); foreach (var r in records) { diff --git a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs index 66b120b..9e73521 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs @@ -19,19 +19,6 @@ namespace Luban.Job.Cfg.Defs public List FinalRecords { get; set; } - private List _notTestRecords; - public List NotTestRecords - { - get - { - if (_notTestRecords == null) - { - _notTestRecords = FinalRecords.Where(r => !r.IsTest).ToList(); - } - return _notTestRecords; - } - } - public Dictionary FinalRecordMap { get; set; } public TableDataInfo(List mainRecords, List patchRecords) @@ -50,17 +37,17 @@ namespace Luban.Job.Cfg.Defs public Service CfgTargetService { get; private set; } private readonly string _patchName; - private readonly bool _exportTestData; + private readonly List _excludeTags; public Patch TargetPatch { get; private set; } public TimeZoneInfo TimeZone { get; } - public DefAssembly(string patchName, TimeZoneInfo timezone, bool exportTestData, RemoteAgent agent) + public DefAssembly(string patchName, TimeZoneInfo timezone, List excludeTags, RemoteAgent agent) { this._patchName = patchName; this.TimeZone = timezone; - this._exportTestData = exportTestData; + this._excludeTags = excludeTags; this.Agent = agent; } @@ -126,7 +113,19 @@ namespace Luban.Job.Cfg.Defs public List GetTableExportDataList(DefTable table) { var tableDataInfo = _recordsByTables[table.FullName]; - return _exportTestData ? tableDataInfo.FinalRecords : tableDataInfo.NotTestRecords; + if (_excludeTags.Count == 0) + { + return tableDataInfo.FinalRecords; + } + else + { + var finalRecords = tableDataInfo.FinalRecords.Where(r => r.IsNotFiltered(_excludeTags)).ToList(); + if (table.IsOneValueTable && finalRecords.Count != 1) + { + throw new Exception($"配置表 {table.FullName} 是单值表 mode=one,但数据个数:{finalRecords.Count} != 1"); + } + return finalRecords; + } } public TableDataInfo GetTableDataInfo(DefTable table) diff --git a/src/Luban.Job.Cfg/Source/GenArgs.cs b/src/Luban.Job.Cfg/Source/GenArgs.cs index 5256ea7..62269d8 100644 --- a/src/Luban.Job.Cfg/Source/GenArgs.cs +++ b/src/Luban.Job.Cfg/Source/GenArgs.cs @@ -32,11 +32,8 @@ namespace Luban.Job.Cfg [Option('s', "service", Required = true, HelpText = "service")] public string Service { get; set; } - [Option("export_test_data", Required = false, HelpText = "export test data")] - public bool ExportTestData { get; set; } = false; - - [Option("export_tag_filter", Required = false, HelpText = "export tag filter")] - public string ExportTagFilter { get; set; } = ""; + [Option("export_exclude_tags", Required = false, HelpText = "export exclude tags. default export all tags")] + public string ExportExcludeTags { get; set; } = ""; [Option('t', "l10n_timezone", Required = false, HelpText = "timezone")] public string TimeZone { get; set; } diff --git a/src/Luban.Job.Cfg/Source/JobController.cs b/src/Luban.Job.Cfg/Source/JobController.cs index 842f85c..c9ad06b 100644 --- a/src/Luban.Job.Cfg/Source/JobController.cs +++ b/src/Luban.Job.Cfg/Source/JobController.cs @@ -140,7 +140,8 @@ namespace Luban.Job.Cfg TimeZoneInfo timeZoneInfo = string.IsNullOrEmpty(args.TimeZone) ? null : TimeZoneInfo.FindSystemTimeZoneById(args.TimeZone); - var ass = new DefAssembly(args.PatchName, timeZoneInfo, args.ExportTestData, agent) + var excludeTags = args.ExportExcludeTags.Split(',').Select(t => t.Trim().ToLowerInvariant()).Where(t => !string.IsNullOrEmpty(t)).ToList(); + var ass = new DefAssembly(args.PatchName, timeZoneInfo, excludeTags, agent) { UseUnityVectors = args.UseUnityVectors }; @@ -166,7 +167,7 @@ namespace Luban.Job.Cfg hasLoadCfgData = true; var timer = new ProfileTimer(); timer.StartPhase("load config data"); - await DataLoaderUtil.LoadCfgDataAsync(agent, ass, args.InputDataDir, args.PatchName, args.PatchInputDataDir, args.ExportTestData); + await DataLoaderUtil.LoadCfgDataAsync(agent, ass, args.InputDataDir, args.PatchName, args.PatchInputDataDir); timer.EndPhaseAndLog(); if (needL10NTextConvert) diff --git a/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs index c7ff457..f7660a9 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataLoaderUtil.cs @@ -71,7 +71,7 @@ namespace Luban.Job.Cfg.Utils // return CollectInputFilesAsync(agent, table.InputFiles, dataDir) //} - public static async Task GenerateLoadRecordFromFileTasksAsync(RemoteAgent agent, DefTable table, string dataDir, List inputFiles2, bool exportTestData, List>> tasks) + public static async Task GenerateLoadRecordFromFileTasksAsync(RemoteAgent agent, DefTable table, string dataDir, List inputFiles2, List>> tasks) { var inputFileInfos = await CollectInputFilesAsync(agent, inputFiles2, dataDir); @@ -93,8 +93,7 @@ namespace Luban.Job.Cfg.Utils file.OriginFile, file.SheetName, await agent.GetFromCacheOrReadAllBytesAsync(file.ActualFile, file.MD5), - RenderFileUtil.IsExcelFile(file.ActualFile), - exportTestData); + RenderFileUtil.IsExcelFile(file.ActualFile)); FileRecordCacheManager.Ins.AddCacheLoadedRecords(table, file.MD5, file.SheetName, res); @@ -103,10 +102,10 @@ namespace Luban.Job.Cfg.Utils } } - public static async Task LoadTableAsync(RemoteAgent agent, DefTable table, string dataDir, string patchName, string patchDataDir, bool exportTestData) + public static async Task LoadTableAsync(RemoteAgent agent, DefTable table, string dataDir, string patchName, string patchDataDir) { var mainLoadTasks = new List>>(); - var mainGenerateTask = GenerateLoadRecordFromFileTasksAsync(agent, table, dataDir, table.InputFiles, exportTestData, mainLoadTasks); + var mainGenerateTask = GenerateLoadRecordFromFileTasksAsync(agent, table, dataDir, table.InputFiles, mainLoadTasks); var patchLoadTasks = new List>>(); @@ -116,7 +115,7 @@ namespace Luban.Job.Cfg.Utils var patchInputFiles = table.GetPatchInputFiles(patchName); if (patchInputFiles != null) { - patchGenerateTask = GenerateLoadRecordFromFileTasksAsync(agent, table, patchDataDir, patchInputFiles, exportTestData, patchLoadTasks); + patchGenerateTask = GenerateLoadRecordFromFileTasksAsync(agent, table, patchDataDir, patchInputFiles, patchLoadTasks); } } @@ -146,7 +145,7 @@ namespace Luban.Job.Cfg.Utils s_logger.Trace("table:{name} record num:{num}", table.FullName, mainRecords.Count); } - public static async Task LoadCfgDataAsync(RemoteAgent agent, DefAssembly ass, string dataDir, string patchName, string patchDataDir, bool exportTestData) + public static async Task LoadCfgDataAsync(RemoteAgent agent, DefAssembly ass, string dataDir, string patchName, string patchDataDir) { var ctx = agent; List exportTables = ass.Types.Values.Where(t => t is DefTable ct && ct.NeedExport).Select(t => (DefTable)t).ToList(); @@ -160,7 +159,7 @@ namespace Luban.Job.Cfg.Utils genDataTasks.Add(Task.Run(async () => { long beginTime = TimeUtil.NowMillis; - await LoadTableAsync(agent, table, dataDir, patchName, patchDataDir, exportTestData); + await LoadTableAsync(agent, table, dataDir, patchName, patchDataDir); long endTime = TimeUtil.NowMillis; if (endTime - beginTime > 100) { @@ -171,10 +170,10 @@ namespace Luban.Job.Cfg.Utils await Task.WhenAll(genDataTasks.ToArray()); } - public static List LoadCfgRecords(TBean recordType, string originFile, string sheetName, byte[] content, bool multiRecord, bool exportTestData) + public static List LoadCfgRecords(TBean recordType, string originFile, string sheetName, byte[] content, bool multiRecord) { // (md5,sheet,multiRecord,exportTestData) -> (valuetype, List<(datas)>) - var dataSource = DataSourceFactory.Create(originFile, sheetName, new MemoryStream(content), exportTestData); + var dataSource = DataSourceFactory.Create(originFile, sheetName, new MemoryStream(content)); try { if (multiRecord) diff --git a/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs index 7abbfd1..9d983d3 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataUtil.cs @@ -117,33 +117,18 @@ namespace Luban.Job.Cfg.Utils { return !string.IsNullOrEmpty(tagName) && ( - tagName.Equals("false", System.StringComparison.OrdinalIgnoreCase) - || tagName.Equals("no", System.StringComparison.OrdinalIgnoreCase) + tagName.Equals("no", System.StringComparison.OrdinalIgnoreCase) || tagName.Equals("##", System.StringComparison.Ordinal) - //|| tagName.Equals("", System.StringComparison.Ordinal) ); } - private static bool IsTestTag(string tagName) - { - return !string.IsNullOrEmpty(tagName) && - (tagName.Equals("test", System.StringComparison.OrdinalIgnoreCase) - || tagName.Equals("", System.StringComparison.Ordinal) - ); - } - - public static bool IsTestTag(List tagNames) - { - return tagNames.Any(IsTestTag); - } - public static List ParseTags(string rawTagStr) { if (string.IsNullOrWhiteSpace(rawTagStr)) { return null; } - var tags = new List(rawTagStr.Split(',').Select(t => t.Trim()).Where(t => !string.IsNullOrEmpty(t))); + var tags = new List(rawTagStr.Split(',').Select(t => t.Trim().ToLower()).Where(t => !string.IsNullOrEmpty(t))); return tags.Count > 0 ? tags : null; } diff --git a/src/Luban.Job.Cfg/Source/ValidatorContext.cs b/src/Luban.Job.Cfg/Source/ValidatorContext.cs index f0dc71a..a9bd996 100644 --- a/src/Luban.Job.Cfg/Source/ValidatorContext.cs +++ b/src/Luban.Job.Cfg/Source/ValidatorContext.cs @@ -201,17 +201,17 @@ namespace Luban.Job.Cfg { case ETableMode.ONE: { - if (mainRecords.Count != 1) - { - throw new Exception($"配置表 {table.FullName} 是单值表 mode=one,但主文件数据个数:{mainRecords.Count} != 1"); - } - if (patchRecords != null && patchRecords.Count != 1) - { - throw new Exception($"配置表 {table.FullName} 是单值表 mode=one,但分支文件数据个数:{patchRecords.Count} != 1"); - } + //if (mainRecords.Count != 1) + //{ + // throw new Exception($"配置表 {table.FullName} 是单值表 mode=one,但主文件数据个数:{mainRecords.Count} != 1"); + //} + //if (patchRecords != null && patchRecords.Count != 1) + //{ + // throw new Exception($"配置表 {table.FullName} 是单值表 mode=one,但分支文件数据个数:{patchRecords.Count} != 1"); + //} if (patchRecords != null) { - mainRecords[0] = patchRecords[0]; + mainRecords = patchRecords; } break; } diff --git a/src/Luban.Job.Cfg/Source/l10n/TextTable.cs b/src/Luban.Job.Cfg/Source/l10n/TextTable.cs index b7ce122..75f7390 100644 --- a/src/Luban.Job.Cfg/Source/l10n/TextTable.cs +++ b/src/Luban.Job.Cfg/Source/l10n/TextTable.cs @@ -66,7 +66,7 @@ namespace Luban.Job.Cfg.l10n public void LoadFromFile(string fileName, byte[] bytes) { - var records = DataLoaderUtil.LoadCfgRecords(_textRowType, fileName, null, bytes, true, false); + var records = DataLoaderUtil.LoadCfgRecords(_textRowType, fileName, null, bytes, true); foreach (var r in records) { //s_logger.Info("== read text:{}", r.Data);