【修复】解决不同平台下生成json和lua数据文件(换行符)不同的问题

main
walon 2021-08-02 13:46:59 +08:00
parent 39d976436c
commit cd6f0f1282
9 changed files with 57 additions and 44 deletions

View File

@ -9,25 +9,6 @@ namespace Luban.Job.Cfg.DataSources
{ {
public const string TAG_KEY = "__tag__"; public const string TAG_KEY = "__tag__";
public static bool IsIgnoreTag(string tagName)
{
return !string.IsNullOrWhiteSpace(tagName) &&
(
tagName.Equals("false", System.StringComparison.OrdinalIgnoreCase)
|| tagName.Equals("no", System.StringComparison.OrdinalIgnoreCase)
|| tagName.Equals("##", System.StringComparison.Ordinal)
|| tagName.Equals("·ñ", System.StringComparison.Ordinal)
);
}
public static bool IsTestTag(string tagName)
{
return !string.IsNullOrWhiteSpace(tagName) &&
(tagName.Equals("test", System.StringComparison.OrdinalIgnoreCase)
|| tagName.Equals("²âÊÔ", System.StringComparison.Ordinal)
);
}
public string RawUrl { get; protected set; } public string RawUrl { get; protected set; }
public abstract Record ReadOne(TBean type); public abstract Record ReadOne(TBean type);

View File

@ -2,6 +2,7 @@ using ExcelDataReader;
using Luban.Job.Cfg.DataCreators; using Luban.Job.Cfg.DataCreators;
using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.Datas;
using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Cfg.TypeVisitors;
using Luban.Job.Cfg.Utils;
using Luban.Job.Common.Types; using Luban.Job.Common.Types;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -529,7 +530,7 @@ namespace Luban.Job.Cfg.DataSources.Excel
// 删除所有标题行,包含字段名行、属性行、标题、描述等等非有效数据行 // 删除所有标题行,包含字段名行、属性行、标题、描述等等非有效数据行
this._rowColumns.RemoveRange(0, Math.Min(TitleRows + titleRowNum - 1, this._rowColumns.Count)); this._rowColumns.RemoveRange(0, Math.Min(TitleRows + titleRowNum - 1, this._rowColumns.Count));
// 删除忽略的记录行 // 删除忽略的记录行
this._rowColumns.RemoveAll(row => AbstractDataSource.IsIgnoreTag(GetRowTag(row))); this._rowColumns.RemoveAll(row => DataUtil.IsIgnoreTag(GetRowTag(row)));
} }
} }
@ -629,7 +630,7 @@ namespace Luban.Job.Cfg.DataSources.Excel
{ {
return null; return null;
} }
bool isTest = AbstractDataSource.IsTestTag(GetRowTag(row)); bool isTest = DataUtil.IsTestTag(GetRowTag(row));
var data = (DBean)ExcelNamedRowDataCreator.Ins.ReadExcel(new NamedRow(_rootTitle, row), type); var data = (DBean)ExcelNamedRowDataCreator.Ins.ReadExcel(new NamedRow(_rootTitle, row), type);
return new Record(data, RawUrl, isTest); return new Record(data, RawUrl, isTest);
} }
@ -640,7 +641,7 @@ namespace Luban.Job.Cfg.DataSources.Excel
{ {
return null; return null;
} }
bool isTest = AbstractDataSource.IsTestTag(GetRowTag(rows[0])); bool isTest = DataUtil.IsTestTag(GetRowTag(rows[0]));
var data = (DBean)ExcelNamedRowDataCreator.Ins.ReadExcel(new NamedRow(_rootTitle, rows), type); var data = (DBean)ExcelNamedRowDataCreator.Ins.ReadExcel(new NamedRow(_rootTitle, rows), type);
return new Record(data, RawUrl, isTest); return new Record(data, RawUrl, isTest);
} }

View File

@ -2,6 +2,7 @@ using Luban.Job.Cfg.DataCreators;
using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.Datas;
using Luban.Job.Cfg.Defs; using Luban.Job.Cfg.Defs;
using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Cfg.TypeVisitors;
using Luban.Job.Cfg.Utils;
using Luban.Job.Common.Types; using Luban.Job.Common.Types;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -31,11 +32,11 @@ namespace Luban.Job.Cfg.DataSources.Json
if (_data.TryGetProperty(TAG_KEY, out var tagEle)) if (_data.TryGetProperty(TAG_KEY, out var tagEle))
{ {
var tagName = tagEle.GetString(); var tagName = tagEle.GetString();
if (IsIgnoreTag(tagName)) if (DataUtil.IsIgnoreTag(tagName))
{ {
return null; return null;
} }
isTest = IsTestTag(tagName); isTest = DataUtil.IsTestTag(tagName);
} }
var data = (DBean)type.Apply(JsonDataCreator.Ins, _data, (DefAssembly)type.Bean.AssemblyBase); var data = (DBean)type.Apply(JsonDataCreator.Ins, _data, (DefAssembly)type.Bean.AssemblyBase);

View File

@ -2,6 +2,7 @@ using Luban.Job.Cfg.DataCreators;
using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.Datas;
using Luban.Job.Cfg.Defs; using Luban.Job.Cfg.Defs;
using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Cfg.TypeVisitors;
using Luban.Job.Cfg.Utils;
using Luban.Job.Common.Types; using Luban.Job.Common.Types;
using Neo.IronLua; using Neo.IronLua;
using System.Collections.Generic; using System.Collections.Generic;
@ -48,12 +49,12 @@ namespace Luban.Job.Cfg.DataSources.Lua
protected Record ReadRecord(LuaTable table, TBean type) protected Record ReadRecord(LuaTable table, TBean type)
{ {
string tagName = table.GetValue(TAG_KEY)?.ToString(); string tagName = table.GetValue(TAG_KEY)?.ToString();
if (IsIgnoreTag(tagName)) if (DataUtil.IsIgnoreTag(tagName))
{ {
return null; return null;
} }
var data = (DBean)type.Apply(LuaDataCreator.Ins, table, (DefAssembly)type.Bean.AssemblyBase); var data = (DBean)type.Apply(LuaDataCreator.Ins, table, (DefAssembly)type.Bean.AssemblyBase);
var isTest = IsTestTag(tagName); var isTest = DataUtil.IsTestTag(tagName);
return new Record(data, RawUrl, isTest); return new Record(data, RawUrl, isTest);
} }
} }

View File

@ -2,6 +2,7 @@ using Luban.Job.Cfg.DataCreators;
using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.Datas;
using Luban.Job.Cfg.Defs; using Luban.Job.Cfg.Defs;
using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Cfg.TypeVisitors;
using Luban.Job.Cfg.Utils;
using Luban.Job.Common.Types; using Luban.Job.Common.Types;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -28,12 +29,12 @@ namespace Luban.Job.Cfg.DataSources.Xml
public override Record ReadOne(TBean type) public override Record ReadOne(TBean type)
{ {
string tagName = _doc.Element(TAG_KEY)?.Value; string tagName = _doc.Element(TAG_KEY)?.Value;
if (IsIgnoreTag(tagName)) if (DataUtil.IsIgnoreTag(tagName))
{ {
return null; return null;
} }
var data = (DBean)type.Apply(XmlDataCreator.Ins, _doc, (DefAssembly)type.Bean.AssemblyBase); var data = (DBean)type.Apply(XmlDataCreator.Ins, _doc, (DefAssembly)type.Bean.AssemblyBase);
bool isTest = IsTestTag(tagName); bool isTest = DataUtil.IsTestTag(tagName);
return new Record(data, RawUrl, isTest); return new Record(data, RawUrl, isTest);
} }
} }

View File

@ -770,7 +770,7 @@ namespace {ctx.TopModule}
{ {
var content = DataExporterUtil.ToOutputData(c, ctx.Assembly.GetTableExportDataList(c), genType); var content = DataExporterUtil.ToOutputData(c, ctx.Assembly.GetTableExportDataList(c), genType);
var file = GetOutputFileName(genType, c.OutputDataFile); var file = GetOutputFileName(genType, c.OutputDataFile);
var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); var md5 = CacheFileUtil.GenStringOrBytesMd5AndAddCache(file, content);
ctx.GenDataFilesInOutputDataDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); ctx.GenDataFilesInOutputDataDir.Add(new FileInfo() { FilePath = file, MD5 = md5 });
})); }));
} }
@ -779,32 +779,30 @@ namespace {ctx.TopModule}
private async Task GenJsonDataMonolithic(GenContext ctx) private async Task GenJsonDataMonolithic(GenContext ctx)
{ {
var exportTables = ctx.ExportTables; var exportTables = ctx.ExportTables;
List<Task<byte[]>> allJsonTask = new List<Task<byte[]>>(); var allJsonTask = new List<Task<string>>();
foreach (var c in exportTables) foreach (var c in exportTables)
{ {
allJsonTask.Add(Task.Run(() => allJsonTask.Add(Task.Run(() =>
{ {
return DataExporterUtil.ToOutputData(c, ctx.Assembly.GetTableExportDataList(c), "data_json"); return (string)DataExporterUtil.ToOutputData(c, ctx.Assembly.GetTableExportDataList(c), "data_json");
})); }));
} }
await Task.WhenAll(allJsonTask);
int estimatedCapacity = allJsonTask.Sum(t => t.Result.Length + 100); var lines = new List<string>();
var sb = new MemoryStream(estimatedCapacity);
sb.Write(System.Text.Encoding.UTF8.GetBytes("{\n")); lines.Add("{");
for (int i = 0; i < exportTables.Count; i++) for (int i = 0; i < exportTables.Count; i++)
{ {
if (i != 0) if (i != 0)
{ {
sb.Write(System.Text.Encoding.UTF8.GetBytes((",\n"))); lines.Add(",");
} }
sb.Write(System.Text.Encoding.UTF8.GetBytes("\"" + exportTables[i].Name + "\":")); lines.Add($"\"{exportTables[i].NeedExport}\":");
sb.Write(allJsonTask[i].Result); lines.Add(await allJsonTask[i]);
} }
sb.Write(System.Text.Encoding.UTF8.GetBytes("\n}")); lines.Add("}");
var content = sb.ToArray(); var content = string.Join('\n', lines);
s_logger.Debug("estimated size:{0} actual size:{1}", estimatedCapacity, content.Length);
var outputFile = ctx.GenArgs.OutputDataJsonMonolithicFile; var outputFile = ctx.GenArgs.OutputDataJsonMonolithicFile;
var md5 = CacheFileUtil.GenMd5AndAddCache(outputFile, content); var md5 = CacheFileUtil.GenMd5AndAddCache(outputFile, content);
ctx.GenScatteredFiles.Add(new FileInfo() { FilePath = outputFile, MD5 = md5 }); ctx.GenScatteredFiles.Add(new FileInfo() { FilePath = outputFile, MD5 = md5 });

View File

@ -17,7 +17,7 @@ namespace Luban.Job.Cfg.Utils
{ {
public static class DataExporterUtil public static class DataExporterUtil
{ {
public static byte[] ToOutputData(DefTable table, List<Record> records, string dataType) public static object ToOutputData(DefTable table, List<Record> records, string dataType)
{ {
switch (dataType) switch (dataType)
{ {
@ -40,7 +40,7 @@ namespace Luban.Job.Cfg.Utils
}); });
JsonExportor.Ins.WriteList(records, table.Assembly, jsonWriter); JsonExportor.Ins.WriteList(records, table.Assembly, jsonWriter);
jsonWriter.Flush(); jsonWriter.Flush();
return DataUtil.StreamToBytes(ss); return System.Text.Encoding.UTF8.GetString(DataUtil.StreamToBytes(ss));
} }
case "data_lua": case "data_lua":
{ {
@ -63,7 +63,7 @@ namespace Luban.Job.Cfg.Utils
throw new NotSupportedException(); throw new NotSupportedException();
} }
} }
return System.Text.Encoding.UTF8.GetBytes(string.Join('\n', content)); return string.Join('\n', content);
} }
default: default:
{ {

View File

@ -100,6 +100,26 @@ namespace Luban.Job.Cfg.Utils
} }
} }
public static bool IsIgnoreTag(string tagName)
{
return !string.IsNullOrEmpty(tagName) &&
(
tagName.Equals("false", System.StringComparison.OrdinalIgnoreCase)
|| tagName.Equals("no", System.StringComparison.OrdinalIgnoreCase)
|| tagName.Equals("##", System.StringComparison.Ordinal)
|| tagName.Equals("·ñ", System.StringComparison.Ordinal)
);
}
public static bool IsTestTag(string tagName)
{
return !string.IsNullOrEmpty(tagName) &&
(tagName.Equals("test", System.StringComparison.OrdinalIgnoreCase)
|| tagName.Equals("²âÊÔ", System.StringComparison.Ordinal)
);
}
//public static string Data2String(DType data) //public static string Data2String(DType data)
//{ //{
// var s = new StringBuilder(); // var s = new StringBuilder();

View File

@ -25,6 +25,16 @@ namespace Luban.Job.Common.Utils
} }
} }
public static string GenStringOrBytesMd5AndAddCache(string fileName, object content)
{
switch (content)
{
case string s: return GenMd5AndAddCache(fileName, s);
case byte[] bs: return GenMd5AndAddCache(fileName, bs);
default: throw new System.NotSupportedException();
}
}
public static string GenMd5AndAddCache(string fileName, string content) public static string GenMd5AndAddCache(string fileName, string content)
{ {
content = content.Replace("\r\n", "\n"); content = content.Replace("\r\n", "\n");