From 412173f1c062f9cca51ab87236b8658dc768e552 Mon Sep 17 00:00:00 2001 From: walon Date: Thu, 2 Sep 2021 10:52:19 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=9B=B4=E6=96=B0=E3=80=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 90 +++++++------- docs/images/install/install_04.png | Bin 11511 -> 51774 bytes docs/images/install/install_10.png | Bin 0 -> 31076 bytes docs/install.md | 191 ++++++++++++----------------- docs/luban_install_manual.md | 20 ++- 5 files changed, 138 insertions(+), 163 deletions(-) create mode 100644 docs/images/install/install_10.png diff --git a/README.md b/README.md index 56a84e3..8de4405 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ luban基于 **meta定义 + 数据源** 的设计,实现了**完备的类型系 Luban适合有以下需求的开发者: - 希望找一个功能完备经受过上线项目检验的满足**中大型**游戏项目配置需求的游戏配置解决方案 +- 希望有较完善的工作流,有效提高策划与程序的开发效率 - 希望针对项目需求方便地定制配置、消息等生成,满足更严苛的内存和性能的要求 - 希望做其他自定义生成或者缓存 @@ -54,13 +55,13 @@ Luban适合有以下需求的开发者: - **强大完备的类型系统**。**可以优雅表达任意复杂的数据结构**。支持所有常见原生类型、datetime类型、容器类型list,set,map、枚举和结构、**多态结构**以及**可空类型**。 - 支持增强的excel格式。可以在excel里比较简洁填写出非常复杂的数据(比如顶层字段包含"list,A"类型字段, 而A是结构并且其中又包含"list,B"类型字段,B也是结构并且包含"list,C"这样的字段...)。 - 生成代码清晰易读、良好模块化。特地支持运行时原子性热更新配置。 -- 使用云生成模式。生成极快,MMORPG这样大型项目也能秒内生成。日常增量生成基本在300ms以内。节省迭代时间。支持watch监测模式,数据目录变化立即重新生成。 +- 生成极快。支持常规的本地缓存增量生成模式,也支持云生成模式。MMORPG这样大型项目也能秒内生成。日常增量生成基本在300ms以内,项目后期极大节省了迭代时间。另外支持**watch监测模式**,数据目录变化立即重新生成。 - 灵活的数据源定义。一个表可以来自多个文件或者一个文件内定义多个表或者一个目录下所有文件甚至来自云表格,以及以上的组合 - 支持表与字段级别分组。可以选择性地导出客户端或者服务器所用的表及字段 - 多种导出数据格式支持。支持binary、json、lua、xml、erlang 等导出数据格式 -- **====>强大灵活的定制能力<====** - - **支持代码模板,可以用自定义模板定制生成的代码格式** - - **支持数据模板,可以用模板文件定制导出格式**。意味着可以在不改动现有程序代码的情况下,把luban当作**配置处理前端**,生成自定义格式的数据与自己项目的配置加载代码配合工作。开发已久的项目或者已经上线的老项目,也能从luban强大的数据处理工作流中获益 +- 强大灵活的定制能力 + - 支持代码模板,可以用自定义模板定制生成的代码格式 + - **支持数据模板**,可以用模板文件定制导出格式。意味着可以在不改动现有程序代码的情况下,把luban当作**配置处理前端**,生成自定义格式的数据与自己项目的配置加载代码配合工作。开发已久的项目或者已经上线的老项目,也能从luban强大的数据处理工作流中获益 - 支持数据标签。 可以选择导出符合要求的数据,发布正式数据时策划不必手动注释掉那些测试数据了 - 强大的数据校验能力。支持内建数据格式检查;支持ref表引用检查(策划不用担心填错id);支持path资源检查(策划不用担心填错资源路径);支持range检查 - 支持常量别名。策划不必再为诸如 升级丹 这样的道具手写具体道具id了 @@ -140,60 +141,59 @@ Luban适合有以下需求的开发者: 这儿只简略展示lua、c#、typescript、go语言在开发中的用法,更多语言以及更详细的使用范例和代码见[示例项目](https://github.com/focus-creative-games/luban_examples)。 -- Lua 使用示例 - - ```Lua - -- 访问一个单例表 - print(require("TbGlobal").name) - -- 访问普通的 key-value 表 - print(require("TbItem")[12].x1) - ``` - C# 使用示例 - ```C# - // 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 - var tables = new cfg.Tables(file => return new ByteBuf(File.ReadAllBytes(gameConfDir + "/" + file))); - // 访问一个单例表 - Console.WriteLine(tables.TbGlobal.Name); - // 访问普通的 key-value 表 - Console.WriteLine(tables.TbItem.Get(12).X1); - // 支持 operator []用法 - Console.WriteLine(tables.TbMail[1001].X2); - ``` +```C# +// 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 +var tables = new cfg.Tables(file => return new ByteBuf(File.ReadAllBytes(gameConfDir + "/" + file))); +// 访问一个单例表 +Console.WriteLine(tables.TbGlobal.Name); +// 访问普通的 key-value 表 +Console.WriteLine(tables.TbItem.Get(12).X1); +// 支持 operator []用法 +Console.WriteLine(tables.TbMail[1001].X2); +``` - typescript 使用示例 - ```typescript - // 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 - let tables = new cfg.Tables(f => JsHelpers.LoadFromFile(gameConfDir, f)) - // 访问一个单例表 - console.log(tables.TbGlobal.name) - // 访问普通的 key-value 表 - console.log(tables.TbItem.get(12).x1) - ``` +```typescript +// 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 +let tables = new cfg.Tables(f => JsHelpers.LoadFromFile(gameConfDir, f)) +// 访问一个单例表 +console.log(tables.TbGlobal.name) +// 访问普通的 key-value 表 +console.log(tables.TbItem.get(12).x1) +``` - go 使用示例 - ```go - // 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 - if tables , err := cfg.NewTables(loader) ; err != nil { - println(err.Error()) - return - } - // 访问一个单例表 - println(tables.TbGlobal.Name) - // 访问普通的 key-value 表 - println(tables.TbItem.Get(12).X1) +```go +// 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 +if tables , err := cfg.NewTables(loader) ; err != nil { + println(err.Error()) + return +} +// 访问一个单例表 +println(tables.TbGlobal.Name) +// 访问普通的 key-value 表 +println(tables.TbItem.Get(12).X1) - ``` +``` + +- Lua 使用示例 + +```Lua +-- 访问一个单例表 +print(require("TbGlobal").name) +-- 访问普通的 key-value 表 +print(require("TbItem")[12].x1) +``` ------ ## 配置快速预览 -**luban兼容传统的excel导表工具,可以在excel定义完整的数据表**。与常见的专注于excel的导表工具不同,luban传统做法为定义与数据分离,使用单独的xml定义 **表和结构**,数据文件只包含数据。 - -下面展示完普通兼容例子后,剩余例子都是**定义与数据分离**的传统风格。使用者自己选择是定义与数据混合的方式还是定义与数据分离的方式或者混用两种方式。目前luban_examples项目中大多数示例使用定义与数据分离的方式。 +**luban兼容传统的excel导表工具,可以在excel定义完整的数据表**。与常见的专注于excel的导表工具不同,luban推荐做法为定义与数据分离,使用单独的xml定义 **表和结构**,数据文件只包含数据。 ### 传统兼容横表 @@ -232,7 +232,7 @@ Luban适合有以下需求的开发者:
-### 常规的原生数据 (从本示例起为定义与数据分离的模式) +### 常规的原生数据 (虽然示例中这些表都在xml中定义,实际上它们可以完全只在excel定义) 以下是一个包含所有常见简单原生数据的表。 diff --git a/docs/images/install/install_04.png b/docs/images/install/install_04.png index a965d5cacf9cfff321d4229cf496f90e10d845a6..3b5758b05e7aa7befa3954fb860fe86aa12b8edd 100644 GIT binary patch literal 51774 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 X)%B!~J(Zy+y(=y(C6pnc>HI$c*%|kU literal 11511 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 diff --git a/docs/images/install/install_10.png b/docs/images/install/install_10.png new file mode 100644 index 0000000000000000000000000000000000000000..8a1fe3d3edbf402a0abbbb778f49ac471f356444 GIT binary patch literal 31076 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 LO~q>Ymv8?M$eq%R literal 0 HcmV?d00001 diff --git a/docs/install.md b/docs/install.md index d2aed4a..12e5a4a 100644 --- a/docs/install.md +++ b/docs/install.md @@ -7,49 +7,44 @@ 下载项目 [luban_examples](https://github.com/focus-creative-games/luban_examples)。 项目中包含测试配置、最新的luban_client&luban_server工作以及大量的示例项目。为方便起见,后续提及到的文件,默认都指这个项目中的文件。 -1. 部属 luban-server - - 基于 docker - - docker run -d --rm --name luban-server -p 8899:8899 focuscreativegames/luban-server:latest - - - 基于 .net 5 runtime (推荐win平台使用,可跨平台,不需要重新编译) - - 从[示例项目](https://github.com/focus-creative-games/luban_examples/tree/main/Tools/Luban.Server)拷贝 Luban.Server(**可跨平台,即使在linux、mac平台也不需要重新编译**) - - 在Luban.Server目录下运行 dotnet Luban.Server.dll - -1. 使用 luban-client - - 基于 docker (推荐 linux、mac平台使用) - - docker run --rm -v $PWD/.cache.meta:/bin/.cache.meta focuscreativegames/luban-client <参数> - - 提醒! .cache.meta这个文件用于保存本地生成或者提交到远程的文件md5缓存,**强烈推荐** 添加-v 映射,不然每次重新计算所有涉及文件的md5,这可能在项目后期会造成多达几秒的延迟。 - - 基于 .net 5 runtime (推荐win平台使用,可跨平台,不需要重新编译) - - 从[示例项目](https://github.com/focus-creative-games/luban_examples/tree/main/Tools/Luban.Client)拷贝 Luban.Client(**可跨平台,即使在linux、mac平台也不需要重新编译**) - - 在Luban.Client目录下运行 dotnet Luban.Client.dll <参数> - -1. 设置全局环境变量 - - set_global_envs.bat 脚本文件,它会设置全局环境变量 LUBAN_SERVER_IP 为 127.0.0.1。如果你在其他机器上部属luban-server,请将LUBAN_SERVER_IP改为相应地址。 ## 创建游戏配置 1. 创建目录结构 config 为根目录,下面创建两个子目录 Datas 和 Defines,分别用于 存放策划 excel 及各种配置数据 以及 配置定义。 ![如图](images/install/install_01.png) 2. 在 Defines 目录下创建 \_\_root__.xml 根定义文件 - ![如图](images/install/install_02.png) - 可以直接从 [示例配置](https://github.com/focus-creative-games/luban_examples/tree/main/DesignerConfigs/Defines) 拷贝这个文件。 - 这个 root 文件描述了: +```xml + - - 生成代码的默认顶层命名空间为 cfg - - 有 3 个分组 c,s,e 对应 client,server,editor 分组。 分组用于配置选择性导出。后面再介绍。 - - import name=”.” 表明从当前目录导入所有子模块定义文件。我们会把所有子模块定义文件也放到 Defines 目录下。 - - server 表示最终输出的目标。当前定义了 4 个目标。service 的 group 属性指明了这个目标会包含哪些分组。例如: server 目标就只包含 s 分组,而 all 目标包含了所有分组。我们先不细究这些定义的含义。 + -7. 创建第一个配置表 物品表 + + + + -8. 添加物品表 excel 文件 - 我们可以直接在 Datas 目录下添加 物品表.xlsx 文件,不过如果所有表都放到 Datas 目录下,查找起来很不方便。 - 为了方便,我们按模块组织配置文件,在 Datas 目录下新建一个 item 目录,目录下创建一个 “物品表.xlsx” 文件。 + client + server + editor + + + + 补充table表声明。文件相对data目录 + 补充enum定义。相对data目录 + 补充bean定义。相对data目录 + + + + + +``` + +可以直接从 [示例配置](https://github.com/focus-creative-games/luban_examples/tree/main/DesignerConfigs/Defines) 拷贝这个文件。 + + +4. 添加物品表 excel 文件 + 在 Datas 目录下新建一个 item 目录,目录下创建一个 “物品表.xlsx” 文件。 ![如图](images/install/install_03.png) @@ -57,121 +52,87 @@ ![配置](images/install/install_04.png) - - 第 1 行是 meta 行。有一些关于 excel 文件的元描述,默认全空,使用默认默认值即可。 + - 第 1 行是 meta 行,包含关于excel文件的元描述,title_rows:4表示除了meta行外,有4行标题头。 单元格 A1 必须是 ##。表示这是一个有效数据表。 - 第 2 行是程序字段名行。 - - 第 3 行是标题头行。策划自行填写,可留空。 - - 第 4 行是描述行。策划可以填写字段的补充描述。可留空。 - - 从第 5 开始为实际的数据行。如果某个数据行整行为空,则会被跳过。 + - 第3行是属性行。格式为 type&属性1=值1&属性2=值2 ... + - 第 4 行是标题头行。策划自行填写,可留空。 + - 第 5 行是描述行。策划可以填写字段的补充描述。可留空。 + - 从第 6 开始为实际的数据行。如果某个数据行整行为空,则会被跳过。 - 我们定义一个简单的物品表,有 4 个字段。 +然后再在 Datas 目录下的tables.xlsx(请从 DesignerConfigs/Datas目录拷贝过来)添加表声明。如下图: - - id 道具 id - - name 道具名 - - desc 道具描述 - - price 道具购买价格 +![添加声明](images/install/install_10.png) -9. 创建定义 - 我们已经填好了第一个配置表,此时应该会有疑问: - - 1. 字段类型呢?字段类型怎么没有定义啊? - 2. 生成的代码中相关的类名又在哪儿获得呢? - 3. 如何导出?最终导出的数据在哪个文件? 导出文件又是啥格式? - - --- - 我们正式开始: - - 每个配置表都需要在某个子模块定义文件中添加一个相应的定义描述,每个模块可以包含多个表定义。 - - 我们在 Defines 目录创建 item.xml,item.xml 是一个子模块定义文件,用于包含物品模块的所有结构,枚举及配表定义。接着在 item.xml 里添加物品表相关定义。 - - 文件内容如下: - - ![定义](images/install/install_05.png) - - - 简略介绍一下定义: - - table 是表定义,每个表都有一个对应的表定义。 - - name 表名。推荐采取 TbXXXX 这种名字约定。 - - value 记录的类型。即配置表里每行记录的类型。 - - index 以 value 的哪个字段为主键。这里用 Item 结构里的 id 字段做主键。可为空,默认为第一个字段。 - - input 数据源。这个表的数据文件来源,相对 Datas 目录。可以是多个,以英文分号 ; 分割。 - - bean 用于定义公用结构,同时也用于定义表记录结构。 - - name 类型名。 这儿取 Item,最终生成的 c#代码会使用 cfg.item.Item 这样的类名。 - - var 用于定义字段。 - - name 字段名。推荐统一 xx_yy_zz 这种风格。 - - type 字段类型。 可以是 bool,int,float,string 等等,完整的类型参见链接。 10. 至此,物品表的创建工作大功告成! ## 生成代码和数据以及在程序中使用 -- 根据前后端以及引擎和平台类型以及所用语言,介绍常见组合下,如何生成代码和数据。 - 1. 项目准备。 - 拷贝示例项目中 Csharp_DotNetCore_bin\Core 目录到项目中,可以自由组织位置。 - 此时尝试编译项目,理论上应该能成功编译。 - 2. 运行生成命令 +1. 项目准备。 + +拷贝示例项目中 Csharp_DotNetCore_bin\Core 目录到项目中,可以自由组织位置。 此时尝试编译项目,理论上应该能成功编译。 + +2. 运行生成命令 - - ```bat - - -h 127.0.0.1 ^ - -p 8899 ^ +```bat + dotnet -j cfg ^ --^ --define_file ^ --input_data_dir <配置数据根目录(Datas)的路径>^ - --output_code_dir <输出的代码文件的路径>^ + --output_code_dir <生成的代码文件的路径>^ --output_data_dir <导出的数据文件的路径>^ - --service server^ + --service all^ --export_test_data^ --gen_types "code_cs_bin,data_bin" - ``` + ``` - **============提醒=============** +其中 - **如果你们项目使用json导出格式,需要将 --gen_types的参数改为 "code_cs_json,data_json"** +- 指向 Tools/Luban.ClientServer/Luban.ClientServer.dll +- 指向 Define/__root__.xml - **如果你们项目使用typescript并且json导出格式,需要将 --gen_types的参数改为 "code_typescript_json, data_json"** - 更多语言或者导出类型的组合,请参考 [luban_examples](https://github.com/focus-creative-games/luban_examples) +详细的命令文档请看 [install_manual](./luban_install_manual.md)。 - **=============================** +更多语言或者导出类型的组合,请参考 [luban_examples](https://github.com/focus-creative-games/luban_examples) - 如果一切正常,会产生一系列日志,最终一行是 == succ == 。 - ![类似这样](images/install/install_07.png) - 如果遇到 类似这样的错误,说明服务器未启动。 启动 luban-server 即可。 +如果一切正常,会产生一系列日志,最终一行是 == succ == 。 + +![类似这样](images/install/install_07.png) + + +如果一切顺利。生成的代码文件会在 –output_code_dir 参数指定的 目录中,生成的配置数据会在 –output_data_dir 参数指定的目录中。 +把 –output_code_dir 加入到 项目中,编译。此时应该能编译成功。 + +3. 加载配置 - ![错误例子](images/install/install_08.png) +只需一行代码既可完成所有配置表的加载工具 - 如果一切顺利。生成的代码文件会在 –output_code_dir 参数指定的 目录中,生成的配置数据会在 –output_data_dir 参数指定的目录中。 - 把 –output_code_dir 加入到 项目中,编译。此时应该能编译成功。 +```c# + var tables = new cfg.Tables(file => + new Bright.Serialization.ByteBuf( + System.IO.File.ReadAllBytes( + "/" + file))); +``` - 3. 加载配置 - 只需一行代码既可完成所有配置表的加载工具 +![代码](images/install/install_09.png) - ```c# - var tables = new cfg.Tables(file => - new Bright.Serialization.ByteBuf( - System.IO.File.ReadAllBytes( + "/" + file))); - ``` +4. 使用加载后的配置表 + cfg.Tables 里包含所有配置表的一个实例字段。 + 加载完 cfg.Tables 后,只需要用 tables.<表名> 就能获得那个表实例,接着可以做各种操作。 + 例如我们要访问 id = 1 的那个记录。代码如下 - ![代码](images/install/install_09.png) - 4. 使用加载后的配置表 - cfg.Tables 里包含所有配置表的一个实例字段。 - 加载完 cfg.Tables 后,只需要用 tables.<表名> 就能获得那个表实例,接着可以做各种操作。 - 例如我们要访问 id = 1 的那个记录。代码如下 +```c# + cfg.item.Item itemInfo = tables.TbItem.Get(1); + Console.WriteLine(“{0} {1} {2} {3}”, + itemInfo.Id, itemInfo.X1, itemInfo.X2,itemInfo.X3) +``` - ```c# - cfg.item.Item itemInfo = tables.TbItem.Get(1); - Console.WriteLine(“{0} {1} {2} {3}”, - itemInfo.Id, itemInfo.Name, itemInfo.Desc,itemInfo.Price) - ``` - 可能你会注意到,item.xml 里定义 Item 时,字段名 id,name,desc,price 首字母被大写了。 - 工具会根据输出的语言,自动作相应代码风格的字段名转换,也即 boo_bar 会被转换为 BooBar 这样的名字。 - 这也是为什么推荐 配置字段定义时统一使用 xx_yy_zz 的风格。 +可能你会注意到,item.xml 里定义 Item 时,字段名 id,x1,x2,x3 首字母被大写了。工具会根据输出的语言,自动作相应代码风格的字段名转换,也即 boo_bar 会被转换为 BooBar 这样的名字。这也是为什么推荐 配置字段定义时统一使用 xx_yy_zz 的风格。 5. 至此完成 配置加载与使用! diff --git a/docs/luban_install_manual.md b/docs/luban_install_manual.md index 2d40520..71998b0 100644 --- a/docs/luban_install_manual.md +++ b/docs/luban_install_manual.md @@ -1,7 +1,11 @@ ## 部属 -### 部属 luban-server +Luban工具有两种部属方式。 + +### 方法1: Luban.Client与Luban.Server独立部属,云生成模式 + +#### 部属 luban-server - 基于 docker (强烈推荐以这种方式在服务器上部属luban-server,因为可以充分利用缓存机制大幅缩短生成时间) @@ -10,9 +14,9 @@ - 基于 .net 5 runtime (可跨平台,不需要重新编译) - 自行安装 .net 5 runtime. - 从[示例项目](https://github.com/focus-creative-games/luban_examples/tree/main/Tools/Luban.Server)拷贝 Luban.Server(**可跨平台,即使在linux、mac平台也不需要重新编译**) - - 在Luban.Server目录下运行 dotnet Luban.Server.dll (Win平台可以直接运行 Luban.Server.exe) + - 在Luban.Server目录下运行 dotnet Luban.Server.dll (提示:Win平台可以直接运行 Luban.Server.exe) -### 安装 luban-client +#### 安装 luban-client - 基于 docker (只推荐与jenkins之类devops工具配合使用,因为docker容器启动会增加一定的延迟) docker run --rm -v $PWD/.cache.meta:/bin/.cache.meta focuscreativegames/luban-client <参数> @@ -23,6 +27,16 @@ - 从[示例项目](https://github.com/focus-creative-games/luban_examples/tree/main/Tools/Luban.Client)拷贝 Luban.Client(**可跨平台,即使在linux、mac平台也不需要重新编译**) + +### 方法2: Client与Server一体模式 + + Client与Server在同个进程内运行,不需要单独部属Luban.Server。 + + 将运行脚本中%LUBAN_CLIENT%变量由 Luban.Client/Luban.Client 改为 Luban.ClientServer/Luban.ClientServer,同时删除 -h (--host ) 选项及其参数(如果指定了-h选项,则不启动内嵌Luban.Server,使用云生成)。 + + Luban.ClientServer是Luban.Client的功能超集,可以完全替代Luban.Client。 + + ----- ## 使用