Ejemplo n.º 1
0
 public override void Render(GenContext ctx)
 {
     string genType = ctx.GenType;
     foreach (var table in ctx.ExportTables)
     {
         ctx.Tasks.Add(Task.Run(() =>
         {
             var file = RenderFileUtil.GetOutputFileName(genType, table.OutputDataFile, ctx.GenArgs.OutputDataFileExtension);
             var records = ctx.Assembly.GetTableExportDataList(table);
             if (!FileRecordCacheManager.Ins.TryGetRecordOutputData(table, records, genType, out string md5))
             {
                 var content = DataExporterUtil.ToOutputData(table, records, genType);
                 md5 = CacheFileUtil.GenStringOrBytesMd5AndAddCache(file, content);
                 FileRecordCacheManager.Ins.AddCachedRecordOutputData(table, records, genType, md5);
             }
             ctx.GenDataFilesInOutputDataDir.Add(new FileInfo() { FilePath = file, MD5 = md5 });
         }));
     }
 }
        private async Task GenJsonDataMonolithic(GenContext ctx)
        {
            var exportTables = ctx.ExportTables;
            var allJsonTask  = new List <Task <string> >();

            foreach (var c in exportTables)
            {
                allJsonTask.Add(Task.Run(() =>
                {
                    return((string)DataExporterUtil.ToOutputData(c, ctx.Assembly.GetTableExportDataList(c), "data_json2"));
                }));
            }

            var lines = new List <string>();

            lines.Add("{");
            for (int i = 0; i < exportTables.Count; i++)
            {
                if (i != 0)
                {
                    lines.Add(",");
                }
                lines.Add($"\"{exportTables[i].FullName}\":");
                lines.Add(await allJsonTask[i]);
            }
            lines.Add("}");

            var content    = string.Join('\n', lines);
            var outputFile = ctx.GenArgs.OutputDataJsonMonolithicFile;
            var md5        = CacheFileUtil.GenMd5AndAddCache(outputFile, content);

            ctx.GenScatteredFiles.Add(new FileInfo()
            {
                FilePath = outputFile, MD5 = md5
            });
        }
        public override void Render(GenContext ctx)
        {
            var genDataTasks = new List <Task <List <ResourceInfo> > >();

            foreach (var c in ctx.ExportTables)
            {
                genDataTasks.Add(Task.Run(() =>
                {
                    return(DataExporterUtil.ExportResourceList(ctx.Assembly.GetTableExportDataList(c)));
                }));
            }

            ctx.Tasks.Add(Task.Run(async() =>
            {
                var ress          = new HashSet <(string, string)>(10000);
                var resourceLines = new List <string>(10000);
                foreach (var task in genDataTasks)
                {
                    foreach (var ri in await task)
                    {
                        if (ress.Add((ri.Resource, ri.Tag)))
                        {
                            resourceLines.Add($"{ri.Tag},{ri.Resource}");
                        }
                    }
                }
                var file    = ctx.GenArgs.OutputDataResourceListFile;
                var content = string.Join("\n", resourceLines);
                var md5     = CacheFileUtil.GenMd5AndAddCache(file, content);

                ctx.GenScatteredFiles.Add(new FileInfo()
                {
                    FilePath = file, MD5 = md5
                });
            }));
        }
Ejemplo n.º 4
0
        public async Task GenAsync(RemoteAgent agent, GenJob rpc)
        {
            var res = new GenJobRes()
            {
                ErrCode    = Luban.Common.EErrorCode.OK,
                ErrMsg     = "succ",
                FileGroups = new List <FileGroup>(),
            };

            if (!TryParseArg(rpc.Arg.JobArguments, out GenArgs args, out string errMsg))
            {
                res.ErrCode = Luban.Common.EErrorCode.JOB_ARGUMENT_ERROR;
                res.ErrMsg  = errMsg;
                agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res);
                return;
            }

            var timer = new ProfileTimer();

            timer.StartPhase("= gen_all =");
            try
            {
                string inputDataDir  = args.InputDataDir;
                string outputCodeDir = args.OutputCodeDir;
                string outputDataDir = args.OutputDataDir;

                var genTypes = args.GenType.Split(',').Select(s => s.Trim()).ToList();

                timer.StartPhase("build defines");
                var loader = new CfgDefLoader(agent);
                await loader.LoadAsync(args.DefineFile);

                await loader.LoadDefinesFromFileAsync(inputDataDir);

                timer.EndPhaseAndLog();

                var rawDefines = loader.BuildDefines();

                TimeZoneInfo timeZoneInfo = string.IsNullOrEmpty(args.L10nTimeZone) ? null : TimeZoneInfo.FindSystemTimeZoneById(args.L10nTimeZone);

                var excludeTags = args.OutputExcludeTags.Split(',').Select(t => t.Trim().ToLowerInvariant()).Where(t => !string.IsNullOrEmpty(t)).ToList();
                var ass         = new DefAssembly(args.L10nPatchName, timeZoneInfo, excludeTags, agent);
                ass.Load(rawDefines, agent, args);

                List <DefTable>    exportTables = ass.GetExportTables();
                List <DefTypeBase> exportTypes  = ass.GetExportTypes();

                bool hasLoadCfgData = false;

                bool needL10NTextConvert = !string.IsNullOrWhiteSpace(args.L10nInputTextTableFiles);

                async Task CheckLoadCfgDataAsync()
                {
                    if (!hasLoadCfgData)
                    {
                        hasLoadCfgData = true;
                        var timer = new ProfileTimer();
                        timer.StartPhase("load config data");
                        await DataLoaderUtil.LoadCfgDataAsync(agent, ass, args.InputDataDir, args.L10nPatchName, args.L10nPatchInputDataDir, args.InputConvertDataDir);

                        timer.EndPhaseAndLog();

                        if (needL10NTextConvert)
                        {
                            ass.InitL10n(args.L10nTextValueFieldName);
                            await DataLoaderUtil.LoadTextTablesAsync(agent, ass, ".", args.L10nInputTextTableFiles);
                        }

                        timer.StartPhase("validate");
                        var validateCtx = new ValidatorContext(ass, args.ValidateRootDir);
                        await validateCtx.ValidateTables(ass.GetAllTables());

                        timer.EndPhaseAndLog();
                    }
                }

                var tasks = new List <Task>();

                var genCodeFilesInOutputCodeDir = new ConcurrentBag <FileInfo>();
                var genDataFilesInOutputDataDir = new ConcurrentBag <FileInfo>();
                var genScatteredFiles           = new ConcurrentBag <FileInfo>();

                foreach (var genType in genTypes)
                {
                    var ctx = new GenContext()
                    {
                        GenType      = genType,
                        Assembly     = ass,
                        GenArgs      = args,
                        ExportTypes  = exportTypes,
                        ExportTables = exportTables,
                        GenCodeFilesInOutputCodeDir = genCodeFilesInOutputCodeDir,
                        GenDataFilesInOutputDataDir = genDataFilesInOutputDataDir,
                        GenScatteredFiles           = genScatteredFiles,
                        Tasks      = tasks,
                        DataLoader = CheckLoadCfgDataAsync,
                    };
                    GenContext.Ctx = ctx;

                    var render = RenderFactory.CreateRender(genType);
                    if (render == null)
                    {
                        throw new Exception($"unknown gentype:{genType}");
                    }
                    if (render is DataRenderBase)
                    {
                        await CheckLoadCfgDataAsync();
                    }
                    render.Render(ctx);
                    GenContext.Ctx = null;
                }
                await Task.WhenAll(tasks.ToArray());

                if (needL10NTextConvert)
                {
                    var    notConvertTextList = DataExporterUtil.GenNotConvertTextList(ass.NotConvertTextSet);
                    var    md5 = FileUtil.CalcMD5(notConvertTextList);
                    string outputNotConvertTextFile = args.L10nOutputNotTranslatedTextFile;
                    CacheManager.Ins.AddCache(outputNotConvertTextFile, md5, notConvertTextList);

                    genScatteredFiles.Add(new FileInfo()
                    {
                        FilePath = outputNotConvertTextFile, MD5 = md5
                    });
                }

                if (!genCodeFilesInOutputCodeDir.IsEmpty)
                {
                    res.FileGroups.Add(new FileGroup()
                    {
                        Dir = outputCodeDir, Files = genCodeFilesInOutputCodeDir.ToList()
                    });
                }
                if (!genDataFilesInOutputDataDir.IsEmpty)
                {
                    res.FileGroups.Add(new FileGroup()
                    {
                        Dir = outputDataDir, Files = genDataFilesInOutputDataDir.ToList()
                    });
                }
                if (!genScatteredFiles.IsEmpty)
                {
                    res.ScatteredFiles.AddRange(genScatteredFiles);
                }
            }
            catch (DataCreateException e)
            {
                res.ErrCode    = Luban.Common.EErrorCode.DATA_PARSE_ERROR;
                res.ErrMsg     = $@"
=======================================================================
    解析失败!

        文件:        {e.OriginDataLocation}
        错误位置:    {e.DataLocationInFile}
        Err:         {e.OriginErrorMsg}
        字段:        {e.VariableFullPathStr}

=======================================================================
";
                res.StackTrace = e.OriginStackTrace;
            }
            catch (Exception e)
            {
                res.ErrCode    = Luban.Common.EErrorCode.JOB_EXCEPTION;
                res.ErrMsg     = $@"
=======================================================================

{ExceptionUtil.ExtractMessage(e)}

=======================================================================
";
                res.StackTrace = e.StackTrace;
            }
            DefAssemblyBase.LocalAssebmly = null;
            timer.EndPhaseAndLog();

            agent.Session.ReplyRpc <GenJob, GenJobArg, GenJobRes>(rpc, res);
        }