{"id":15773653,"url":"https://github.com/owent/xres-code-generator","last_synced_at":"2025-03-14T02:31:09.099Z","repository":{"id":41274337,"uuid":"190350044","full_name":"owent/xres-code-generator","owner":"owent","description":null,"archived":false,"fork":false,"pushed_at":"2024-08-13T12:56:51.000Z","size":1079,"stargazers_count":3,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-11T16:07:48.193Z","etag":null,"topics":["cpp","cxx","lua","xresloader"],"latest_commit_sha":null,"homepage":null,"language":"Mako","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/owent.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-05T07:48:57.000Z","updated_at":"2024-08-13T12:56:55.000Z","dependencies_parsed_at":"2022-07-13T15:59:44.988Z","dependency_job_id":"e551e1d6-86a9-4b31-955f-9f1340935611","html_url":"https://github.com/owent/xres-code-generator","commit_stats":{"total_commits":136,"total_committers":8,"mean_commits":17.0,"dds":0.5514705882352942,"last_synced_commit":"e99b1bf190772ad524fc4fccb89e7c6589c0506d"},"previous_names":["owent/xres-code-generator"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owent%2Fxres-code-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owent%2Fxres-code-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owent%2Fxres-code-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/owent%2Fxres-code-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/owent","download_url":"https://codeload.github.com/owent/xres-code-generator/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243511636,"owners_count":20302590,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","cxx","lua","xresloader"],"created_at":"2024-10-04T16:02:51.856Z","updated_at":"2025-03-14T02:31:08.682Z","avatar_url":"https://github.com/owent.png","language":"Mako","readme":"# xres-code-generator\r\n\r\n## Sample Usage\r\n\r\n### Common declare loaders\r\n\r\nFirst `import \"xrescode_extensions_v3.proto\";` and declare loaders. See [pb_extension/xrescode_extensions_v3.proto](pb_extension/xrescode_extensions_v3.proto) for details.\r\n\r\n```protobuf\r\nsyntax = \"proto3\";\r\n\r\nimport \"xrescode_extensions_v3.proto\";\r\n\r\nmessage role_upgrade_cfg {\r\n    option (xrescode.loader) = {\r\n        file_path : \"role_upgrade_cfg.bytes\"\r\n        indexes : {\r\n            fields : \"Id\"\r\n            index_type : EN_INDEX_KL // Key - List index: (Id) =\u003e list\u003crole_upgrade_cfg\u003e\r\n        }\r\n        indexes : {\r\n            fields : \"Id\"\r\n            fields : \"Level\"\r\n            index_type : EN_INDEX_KV // Key - Value index: (Id, Level) =\u003e role_upgrade_cfg\r\n        }\r\n        // It's allow to add more indexes, the default name of index is [fields].join(\"_\"), you can change name by name field.\r\n        tags : \"client\"\r\n        tags : \"server\"\r\n    };\r\n\r\n    int32  CostValue = 4;\r\n    int32  ScoreAdd  = 5;\r\n}\r\n```\r\n\r\n### For C++\r\n\r\n1. Copy common files from [template/common/cpp](template/common/cpp)\r\n2. Generate loader codes by template [template/config_manager.h.mako](template/config_manager.h.mako) , [template/config_manager.cpp.mako](template/config_manager.cpp.mako)  , [template/config_easy_api.h.mako](template/config_easy_api.h.mako) , [template/config_easy_api.cpp.mako](template/config_easy_api.cpp.mako) , [template/config_set.h.mako](template/config_set.h.mako) , [template/config_set.cpp.mako](template/config_set.cpp.mako)\r\n\r\n```bash\r\nmkdir -p \"$REPO_DIR/sample/pbcpp\";\r\ncp -rvf \"$REPO_DIR/template/common/cpp/\"* \"$REPO_DIR/sample/pbcpp\";\r\n\r\nPREBUILT_PROTOC=\"$(\"$PYTHON_BIN\" \"$REPO_DIR/tools/find_protoc.py\")\"\r\n\"$PREBUILT_PROTOC\" -I \"$REPO_DIR/sample/proto\" -I \"$REPO_DIR/pb_extension\" \"$REPO_DIR/sample/proto/\"*.proto -o \"$REPO_DIR/sample/sample.pb\" ;\r\n\r\n# You can use --pb-include-prefix \"pbdesc/\" to set subdirectory for generated files. This will influence the generated #include \u003c...FILE_PATH\u003e\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/pbcpp\"  \\\r\n    -g \"$REPO_DIR/template/config_manager.h.mako\" -g \"$REPO_DIR/template/config_manager.cpp.mako\"                       \\\r\n    -g \"$REPO_DIR/template/config_easy_api.h.mako\" -g \"$REPO_DIR/template/config_easy_api.cpp.mako\"                     \\\r\n    -l \"H:$REPO_DIR/template/config_set.h.mako\" -l \"S:$REPO_DIR/template/config_set.cpp.mako\"                           \\\r\n    \"$@\"\r\n\r\n```\r\n\r\n3. At last, just use the generated config_manager and config_easy_api to visit datas.\r\n\r\n```cpp\r\n#include \u003ccstdio\u003e\r\n\r\n#include \"config_manager.h\"\r\n#include \"config_easy_api.h\"\r\n\r\nint main() {\r\n    // Initialize ....\r\n    excel::config_manager::me()-\u003einit();\r\n\r\n    // excel::config_manager::me()-\u003eset_version_loader([] (std::string\u0026 out) {\r\n    //     // Read version from file and write it to out\r\n    //     out.clear(); // Set version to empty will make config_manager ingore version and always reload data files.\r\n    //     return true; // return true if load version success\r\n    // });\r\n\r\n    // If you want to intergrate file loader to your system(such as UE or Unity), you should provide buffer loader handle\r\n    // excel::config_manager::me()-\u003eset_buffer_loader([] (std::string\u0026 out, const char* file_path) {\r\n    //     // Read binary data from file with path=file_path, and write all data into out\r\n    //     // The value of file_path is the same as file_path field of option (xrescode.loader)\r\n    //     return true; // return true if load file success\r\n    // });\r\n\r\n    // Set how much data group will be keep after reload.\r\n    // excel::config_manager::me()-\u003eset_group_number(5);\r\n\r\n    // Call set_override_same_version(true) to force to reload datas even version(load by set_version_loader(HANDLE)) not changed.\r\n    // excel::config_manager::me()-\u003eset_override_same_version(true);\r\n\r\n    // Set logger, the default logger is to write log into stdout\r\n    // excel::config_manager::me()-\u003eset_on_log([](const log_caller_info_t\u0026 caller, const char* content) {\r\n    //    // ...\r\n    // });\r\n\r\n    // Any set any other event handles\r\n\r\n    // Call reload to generate a configure group\r\n    excel::config_manager::me()-\u003ereload();\r\n\r\n    // Now you can load data by easy api or config_manager's raw API\r\n    auto cfg = excel::get_role_upgrade_cfg_by_id_level(10001, 3); // using the Key-Value index: id_level\r\n    if (cfg) {\r\n        printf(\"%s\\n\", cfg-\u003eDebugString().c_str());\r\n    }\r\n    return 0;\r\n}\r\n```\r\n\r\n### For UE(UnrealEngine) Blueprint support\r\n\r\n```bash\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/uepbcpp\"  \\\r\n    --set ue_include_prefix=ExcelLoader --set ue_type_prefix=ExcelLoader \\\r\n    --set ue_api_definition=EXCELLOADER_API --add-path \"$REPO_DIR/template\" \\\r\n    --set \"ue_excel_loader_include_rule=ExcelLoader/%(file_path_camelname)s.h\" \\\r\n    --set \"ue_excel_group_api_include_rule=%(file_basename_without_ext)s.h\" \\\r\n    -f \"H:$REPO_DIR/template/UEExcelLoader.h.mako:ExcelLoader/\\${pb_file.get_file_path_camelname()}.h\" \\\r\n    -f \"S:$REPO_DIR/template/UEExcelLoader.cpp.mako:ExcelLoader/\\${pb_file.get_file_path_camelname()}.cpp\" \\\r\n    -g \"H:$REPO_DIR/template/UEExcelGroupApi.h.mako\" -g \"S:$REPO_DIR/template/UEExcelGroupApi.cpp.mako\" \\\r\n    \"$@\"\r\n```\r\n\r\nAlso, we can use `UEBPProtocol.h.mako` and `UEBPProtocol.cpp.mako` to generate protocol codes for Blueprints.\r\n\r\n```bash\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/uepbcpp\"  \\\r\n  --set ue_include_prefix=ExcelLoader --set ue_type_prefix=ExcelLoader --set ue_bp_protocol_type_prefix=Proto \\\r\n  --set ue_api_definition=EXCELLOADER_API --add-path \"$REPO_DIR/template\" \\\r\n  --set \"ue_excel_loader_include_rule=ExcelLoader/%(file_path_camelname)s.h\" \\\r\n  --set \"ue_bp_protocol_include_rule=ExcelLoader/%(directory_path)s/Proto%(file_base_camelname)s.h\" \\\r\n  --set \"ue_excel_group_api_include_rule=%(file_basename_without_ext)s.h\" \\\r\n  --set \"ue_excel_enum_include_rule=ExcelEnum/%(file_basename_without_ext)s.h\" \\\r\n  --pb-exclude-file \"xrescode_extensions_v3.proto\" \\\r\n  -f \"H:$REPO_DIR/template/UEExcelLoader.h.mako:ExcelLoader/\\${pb_file.get_file_path_camelname()}.h\" \\\r\n  -f \"S:$REPO_DIR/template/UEExcelLoader.cpp.mako:ExcelLoader/\\${pb_file.get_file_path_camelname()}.cpp\" \\\r\n  -g \"H:$REPO_DIR/template/UEExcelGroupApi.h.mako\" -g \"S:$REPO_DIR/template/UEExcelGroupApi.cpp.mako\" \\\r\n  -f \"H:$REPO_DIR/template/UEExcelEnum.h.mako:ExcelEnum/\\${pb_file.get_file_path_camelname()}.h\" \\\r\n  -f \"H:$REPO_DIR/template/UEBPProtocol.h.mako:ExcelLoader/\\${pb_file.get_directory_path()}/Proto\\${pb_file.get_file_base_camelname()}.h\" \\\r\n  -f \"S:$REPO_DIR/template/UEBPProtocol.cpp.mako:ExcelLoader/\\${pb_file.get_directory_path()}/Proto\\${pb_file.get_file_base_camelname()}.cpp\" \\\r\n  \"$@\"\r\n```\r\n\r\n### For lua\r\n\r\n1. Copy common files from [template/common/lua](template/common/lua)\r\n2. Generate loader codes by template [template/DataTableCustomIndex.lua.mako](template/DataTableCustomIndex.lua.mako) , [template/DataTableCustomIndex53.lua.mako](template/DataTableCustomIndex53.lua.mako)\r\n\r\n```bash\r\nmkdir -p \"$REPO_DIR/sample/pblua\";\r\ncp -rvf \"$REPO_DIR/template/common/lua/\"*.lua \"$REPO_DIR/sample/pblua\";\r\n\r\nPREBUILT_PROTOC=\"$(\"$PYTHON_BIN\" \"$REPO_DIR/tools/find_protoc.py\")\"\r\n\"$PREBUILT_PROTOC\" -I \"$REPO_DIR/sample/proto\" -I \"$REPO_DIR/pb_extension\" \"$REPO_DIR/sample/proto/\"*.proto -o \"$REPO_DIR/sample/sample.pb\" ;\r\n\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/pblua\"  \\\r\n    -g \"$REPO_DIR/template/DataTableCustomIndex.lua.mako\"                                                               \\\r\n    -g \"$REPO_DIR/template/DataTableCustomIndex53.lua.mako\"                                                             \\\r\n    \"$@\"\r\n\r\n```\r\n\r\n3. At last, just use the generated `DataTableService53` to visit datas.\r\n\r\n```lua\r\n-- We will use require(...) to load DataTableService53,DataTableCustomIndex53 and custom data files, please ensure these can be load by require(FILE_PATH)\r\n-- Assuming the generated lua files by xresloader is located at ../../../xresloader/sample/proto_v3\r\npackage.path = '../../../xresloader/sample/proto_v3/?.lua;' .. package.path\r\nlocal excel_config_service = require('DataTableService53')\r\n\r\n-- Set logger\r\n-- excel_config_service:OnError = function (message, data_set, indexName, keys...) end\r\n\r\nexcel_config_service:ReloadTables()\r\n\r\nlocal role_upgrade_cfg = excel_config_service:Get(\"role_upgrade_cfg\")\r\nlocal data = role_upgrade_cfg:GetByIndex(\"id_level\", 10001, 3) -- using the Key-Value index: id_level\r\nfor k,v in pairs(data) do\r\n    print(string.format(\"%s=%s\", k, tostring(v)))\r\nend\r\n\r\n-- We can also use DataTableService.GetCurrentGroup(self) and DataTableService.GetByGroup(self, group, loader_name) to support multi-version loader\r\nlocal current_group = excel_config_service:GetCurrentGroup()\r\nlocal role_upgrade_cfg2 = excel_config_service:GetByGroup(current_group, \"role_upgrade_cfg\")\r\nlocal data2 = role_upgrade_cfg:GetByIndex(\"id\", 10001) -- using the Key-List index: id\r\nprint(\"=======================\")\r\nfor _,v1 in ipairs(data2) do\r\n    print(string.format(\"\\tid: %s, level: %s\", tostring(v1.Id), tostring(v1.Level)))\r\n    for k,v2 in pairs(v1) do\r\n        print(string.format(\"\\t\\t%s=%s\", k, tostring(v2)))\r\n    end\r\nend\r\n\r\n```\r\n\r\n### For lua - upb\r\n\r\n1. Copy common files from [template/common/upblua](template/common/upblua)\r\n2. Generate loader codes by template [template/DataTableCustomIndexUpb.lua.mako](template/DataTableCustomIndexUpb.lua.mako)\r\n\r\n```bash\r\nmkdir -p \"$REPO_DIR/sample/upblua\";\r\ncp -rvf \"$REPO_DIR/template/common/upblua/\"*.lua \"$REPO_DIR/sample/upblua\";\r\ncp -rvf \"$REPO_DIR/template/common/lua/vardump.lua\" \"$REPO_DIR/sample/upblua\";\r\n\r\nPREBUILT_PROTOC=\"$(\"$PYTHON_BIN\" \"$REPO_DIR/tools/find_protoc.py\")\"\r\n\"$PREBUILT_PROTOC\" -I \"$REPO_DIR/sample/proto\" -I \"$REPO_DIR/pb_extension\"     \\\r\n    \"--lua_out=$REPO_DIR/sample/upblua\" \"--plugin=protoc-gen-lua=\u003cPATH to protoc-gen-lua\u003e\"          \\\r\n    \"$REPO_DIR/pb_extension/xrescode_extensions_v3.proto\" \"$REPO_DIR/sample/proto/\"*.proto\r\n\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/upblua\" \\\r\n    -g \"$REPO_DIR/template/DataTableCustomIndexUpb.lua.mako\"                                                            \\\r\n    \"$@\"\r\n\r\n```\r\n\r\n3. At last, just use the generated `DataTableCustomIndexUpb` to visit datas.\r\n\r\n```lua\r\n-- We will use require(...) to load\r\n--   - DataTableServiceUpb\r\n--   - DataTableCustomIndexUpb\r\n--   - xrescode_extensions_v3_pb\r\n--   - pb_header_v3_pb\r\n--   - upb\r\n--   - google/protobuf/descriptor_pb\r\n--   - Other custom proto files generated by protoc-gen-lua\r\n-- Please ensure these can be load by require(FILE_PATH)\r\nlocal excel_config_service = require(\"DataTableServiceUpb\")\r\nlocal upb = require('upb')\r\n\r\n-- Set logger\r\n-- excel_config_service:OnError = function (message, data_set, indexName, keys...) end\r\n\r\nexcel_config_service:ReloadTables()\r\n\r\nlocal role_upgrade_cfg = excel_config_service:Get(\"role_upgrade_cfg\")\r\nprint(\"======================= Lazy load begin =======================\")\r\nlocal data = role_upgrade_cfg:GetByIndex(\"id_level\", 10001, 3) -- using the Key-Value index: id_level\r\nprint(\"======================= Lazy load end =======================\")\r\n\r\nprint(\"----------------------- Get by Key-Value index -----------------------\")\r\nprint(string.format(\"Data of role_upgrade_cfg: id=10001, level=3 -\u003e json_encode: %s\",\r\n    upb.json_encode(data, { upb.JSONENC_PROTONAMES })))\r\n\r\nprint(\"----------------------- Get by reflection and Key-List index -----------------------\")\r\nlocal current_group = excel_config_service:GetCurrentGroup()\r\nlocal role_upgrade_cfg2 = excel_config_service:GetByGroup(current_group, \"role_upgrade_cfg\")\r\nlocal data2 = role_upgrade_cfg2:GetByIndex(\"id\", 10001) -- using the Key-List index: id\r\nfor _, v1 in ipairs(data2) do\r\n    print(string.format(\"\\tid: %s, level: %s\", tostring(v1.Id), tostring(v1.Level)))\r\n    for fds in role_upgrade_cfg2:GetMessageDescriptor():fields() do\r\n        print(string.format(\"\\t\\t%s=%s\", fds:name(), tostring(v1[fds:name()])))\r\n    end\r\nend\r\n```\r\n\r\n### For lua - lua-protobuf\r\n\r\n1. Build lua-protobuf from \u003chttps://github.com/starwing/lua-protobuf\u003e\r\n2. Copy common files from [template/common/lua-protobuf](template/common/lua-protobuf)\r\n3. Generate loader codes by template [template/DataTableCustomIndexUpb.lua.mako](template/DataTableCustomIndexUpb.lua.mako) and rename the output to `DataTableCustomIndexLuaProtobuf.lua`\r\n\r\n```bash\r\nmkdir -p \"$REPO_DIR/sample/lua-protobuf\";\r\ncp -rvf \"$REPO_DIR/template/common/lua-protobuf/\"*.lua \"$REPO_DIR/sample/lua-protobuf\";\r\ncp -rvf \"$REPO_DIR/template/common/lua/vardump.lua\" \"$REPO_DIR/sample/lua-protobuf\";\r\n\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/lua-protobuf\"   \\\r\n    -g \"$REPO_DIR/template/DataTableCustomIndexUpb.lua.mako:DataTableCustomIndexLuaProtobuf.lua\"                                \\\r\n    \"$@\"\r\n\r\n```\r\n\r\n4. At last, just use the generated `DataTableCustomIndexLuaProtobuf` to visit datas.\r\n\r\n```lua\r\nlocal pb = require('pb')\r\n\r\n-- ============== Begin: load dependency pb files ==============\r\nlocal function load_pb(file_path)\r\n  local f = io.open(file_path, \"rb\")\r\n  if f == nil then\r\n    error(string.format(\"Open file %s failed\", file_path))\r\n    return nil\r\n  end\r\n  local data = f:read(\"a\")\r\n  f:close()\r\n  pb.load(data)\r\nend\r\n\r\nload_pb('pb_header_v3.pb')\r\nload_pb('sample.pb')\r\n-- ============== End: load dependency pb files ==============\r\n\r\nlocal excel_config_service = require(\"DataTableServiceLuaProtobuf\")\r\nexcel_config_service:ReloadTables()\r\n\r\nprint(\"----------------------- Get by reflection and Key-List index -----------------------\")\r\nlocal current_group = excel_config_service:GetCurrentGroup()\r\nlocal role_upgrade_cfg2 = excel_config_service:GetByGroup(current_group, \"role_upgrade_cfg\")\r\n-- require(\"vardump\")\r\n-- vardump(role_upgrade_cfg2, { show_all = true })\r\nlocal data2 = role_upgrade_cfg2:GetByIndex(\"id\", 10001) -- using the Key-List index: id\r\nfor _, v1 in ipairs(data2) do\r\n  print(string.format(\"\\tid: %s, level: %s\", tostring(v1.Id), tostring(v1.Level)))\r\nend\r\nprint(\"Fields of \" .. role_upgrade_cfg2:GetMessageDescriptor().name)\r\nfor _, fds in ipairs(role_upgrade_cfg2:GetMessageDescriptor().fields) do\r\n  if fds.type.type == nil then\r\n    print(string.format(\"\\t%s %s=%s\", fds.type.name, fds.name, tostring(fds.number)))\r\n  else\r\n    print(string.format(\"\\t%s(%s) %s=%s\", fds.type.name, fds.type.type, fds.name, tostring(fds.number)))\r\n  end\r\nend\r\n\r\n```\r\n\r\n### For C\\#/CSharp\r\n\r\n1. Generate loader codes by template [template/ConfigSet.cs.mako](template/ConfigSet.cs.mako) , [template/ConfigSetManager.cs.mako](template/ConfigSetManager.cs.mako)\r\n\r\n```bash\r\nmkdir -p \"$REPO_DIR/sample/pbcs\";\r\n\r\nPREBUILT_PROTOC=\"$(\"$PYTHON_BIN\" \"$REPO_DIR/tools/find_protoc.py\")\"\r\n\"$PREBUILT_PROTOC\" -I \"$REPO_DIR/sample/proto\" -I \"$REPO_DIR/pb_extension\" \"$REPO_DIR/sample/proto/\"*.proto -o \"$REPO_DIR/sample/sample.pb\" ;\r\n\r\npython \"$REPO_DIR/xrescode-gen.py\" -i \"$REPO_DIR/template\" -p \"$REPO_DIR/sample/sample.pb\" -o \"$REPO_DIR/sample/pbcs\"   \\\r\n    -g \"$REPO_DIR/template/ConfigSet.cs.mako\"                                                                           \\\r\n    -l \"$REPO_DIR/template/ConfigSetManager.cs.mako\"                                                                    \\\r\n    \"$@\"\r\n\r\n```\r\n\r\n2. Use the generated `ConfigSetManager` to visit datas.\r\n\r\n```cs\r\nusing System;\r\nusing excel;\r\nclass Program {\r\n    static void Main(string[] args) {\r\n        ConfigSetManager.Instance.Reload();\r\n        // The C# configSet now generated by Singleton Classes.\r\n        // For the multi ConfigGroup management may be added when need.\r\n        var table = config_set_role_upgrade_cfg.Instance.GetByIdLevel(10001, 3);\r\n        if (table != null) {\r\n            Console.WriteLine(table.ToString());\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n## Custom rule and templates\r\n\r\nYou can custom your loader codes by providing code template files which just like files in `$REPO_DIR/template` .\r\n\r\n* Globale template: `g:\u003ctemplate path\u003e:\u003coutput path\u003e`\r\n    \u003e Example: `g:input.h.mako:input.generated.h`\r\n\r\n* Message template(render for each message with loader): `m:\u003cheader template path\u003e:\u003coutput path rule\u003e`\r\n    \u003e Example: `m:input.h.mako:input.generated.${loader.code.class_name.lower()}.h`\r\n\r\n* Loader template(render for loader): `l:\u003cheader template path\u003e:\u003coutput path rule\u003e`\r\n    \u003e Example: `l:input.h.mako:input.generated.${loader.code.class_name.lower()}.h`\r\n\r\n* File template(render for loader): `f:\u003cheader template path\u003e:\u003coutput path rule\u003e`\r\n    \u003e Example: `f:input.h.mako:input.generated.h`\r\n\r\n## For developers\r\n\r\n### Update dependencies\r\n\r\nUse pip to instal all dependencies:\r\n\r\n```bash\r\n# For python2\r\nenv PATH=\"$HOME/.local/bin:$PATH\" pip install Mako --user -f requirements.txt\r\n# For python3 on Linux or macOS\r\nenv PATH=\"$HOME/.local/bin:$PATH\" python3 -m pip install Mako --user -f requirements.txt\r\n\r\n```\r\n\r\n```powershell\r\n# For python3 on Windows(powershell)\r\n$ENV:PATH=\"$ENV:HOMEDRIVE$ENV:HOMEPATH\\\\.local\\\\bin;$ENV:PATH\"\r\npython -m pip install Mako --user -f requirements.txt\r\n```\r\n\r\nOr you can download and build dependencies by your self as below and use `--add-path \u003ccustom module install path\u003e/--add-package-prefix \u003ccustom module install prefix\u003e` to add them to search paths.\r\n\r\n#### mako\r\n\r\n```bash\r\nMAKO_VERSION=1.2.1 ;\r\ncd 3rd_party ;\r\nwget https://files.pythonhosted.org/packages/ad/dd/34201dae727bb183ca14fd8417e61f936fa068d6f503991f09ee3cac6697/Mako-1.2.1.tar.gz ;\r\ntar -axvf Mako-$MAKO_VERSION.tar.gz ;\r\nrm -rf mako ;\r\nmv Mako-$MAKO_VERSION/mako mako;\r\nchmod 777 -R mako ;\r\nrm -rf Mako-$MAKO_VERSION Mako-$MAKO_VERSION.tar.gz ;\r\n```\r\n\r\n#### six\r\n\r\n```bash\r\nSIX_VERSION=1.16.0 ;\r\ncd 3rd_party ;\r\nwget https://github.com/benjaminp/six/archive/$SIX_VERSION.tar.gz -O six-$SIX_VERSION.tar.gz ;\r\ntar -ax six-$SIX_VERSION.tar.gz ;\r\ncp -f six-$SIX_VERSION/six.py six/six.py ;\r\nchmod 777 -R six ;\r\nrm -rf six-$SIX_VERSION ;\r\n```\r\n\r\n#### protobuf\r\n\r\n```bash\r\nPROTOBUF_VERSION=3.21.1 ;\r\ncd 3rd_party ;\r\nwget https://github.com/protocolbuffers/protobuf/releases/download/v$PROTOBUF_VERSION/protobuf-python-$PROTOBUF_VERSION.tar.gz ;\r\ntar -axvf protobuf-python-$PROTOBUF_VERSION.tar.gz ;\r\ncd protobuf-$PROTOBUF_VERSION ;\r\n./configure ;\r\nmake -j16 ;\r\ncd python ;\r\npython setup.py build ;\r\npython setup sdist ;\r\n\r\ncd ../../ ;\r\nrm -rf protobuf/* ;\r\n\r\nmkdir -p protobuf ;\r\ncp -rf protobuf-$PROTOBUF_VERSION/python/dist/protobuf-$PROTOBUF_VERSION/* protobuf/ ;\r\nchmod 777 -R protobuf ;\r\n\r\n```\r\n\r\n### Update extension codes\r\n\r\n```bash\r\nPREBUILT_PROTOC=\"$(\"$PYTHON_BIN\" \"$REPO_DIR/tools/find_protoc.py\")\"\r\n\"$PREBUILT_PROTOC\" -I \"$REPO_DIR/pb_extension\" \"--python_out=$REPO_DIR/pb_extension\" \"$REPO_DIR/pb_extension/xrescode_extensions_v3.proto\"\r\n```\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowent%2Fxres-code-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fowent%2Fxres-code-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowent%2Fxres-code-generator/lists"}