diff --git a/README.md b/README.md
index f965f5d..7b0d12c 100644
--- a/README.md
+++ b/README.md
@@ -30,10 +30,10 @@ luban相较于常规的excel导表工具有以下核心优势:
- 通用型生成工具。也可以用于生成协议、数据库之类的代码,甚至可以用作对象缓存服务。
## 文档
-- [快速上手](docs/start_up.md)
+- [快速上手](https://github.com/focus-creative-games/luban/wiki/start_up)
- [**wiki**](https://github.com/focus-creative-games/luban/wiki) ,比较完善,有使用疑问,请先查看此wiki。
- **示例项目** ([github](https://github.com/focus-creative-games/luban_examples)) ([gitee](https://gitee.com/focus-creative-games/luban_examples))
-- [版本变更记录](https://github.com/focus-creative-games/luban/wiki/%E7%89%88%E6%9C%AC%E5%8F%98%E6%9B%B4%E8%AE%B0%E5%BD%95)
+- [版本变更记录](https://github.com/focus-creative-games/luban/wiki/changelog)
- 支持与联系
- QQ群: 692890842 (Luban开发交流群)。有使用方面的疑问请及时加QQ群询问,随时有人帮助解决。
diff --git a/docs/catalog.md b/docs/catalog.md
deleted file mode 100644
index 9ece113..0000000
--- a/docs/catalog.md
+++ /dev/null
@@ -1,126 +0,0 @@
-
-* start up
- - [下载 dotnet 5](https://dotnet.microsoft.com/download/dotnet/5.0)
- - [下载 luban.client&luban.server](https://github.com/focus-creative-games/luban_examples/tree/main/Tools)
- - 启动 luban.server
- - 创建游戏配置
- - root.xml
- - 新增一个表定义
- - 新增一个excel文件
- - 生成
- - c# dotnet core
- - gen.client 命令行
- - c# unity
- - c# unity + ILRuntime
- - lua unity xlua
- - lua unity tolua
- - 其他lua
- - java
- - go
- - cpp
- - typescript
- - python 2.7及3.0
-* 进阶
- - 游戏配置
- - excel 篇
- - 标题头定义
- - 定义和配置更多基础类型
- - 定义枚举
- - 定义bean
- - 数据格式
- - 指定某个或者多个sheet或者文件
- - list 或者其他类型
- - group 分组导出
- - tag
- - sep
- - multi_rows
- - 多级标题头
- - 单例表
- - 行表与列表
- - 可空变量
- - datetime
- - convert
- - 多态bean
- - json 篇
- - lua
- - xml
- - 一个同时包含 excel 、 json 配置的项目
- - 数据校验
- - ref
- - path
- - 导出格式
- - bin 格式
- - lua 格式
- - 本地化
-* gen.client & gen.server 工作模型
-
-* 定义 + 数据的 抽象模型
-* 定义
- * 根定义文件
- * group
- * service
- * topmodule
- * import
- * 子模块定义
- * 类型系统
- - 基础类型
- - 可空类型
- - 枚举
- - const
- - bean
- - field
- - convert 常量替换
- - 多态
- * table
- * module
-* 源数据格式
- - excel
- - json
- - lua
- - xml
-* 导出数据格式
- - bin
- - json
- - lua
- - emmylua anntations
-* input 多种数据文件来源
-* group 数据分组
-* tag
-* 资源列表导出
-* validator 数据检验
-* 本地化
-* editor 相关。导出符合luban数据约束的文件。
-* ide支持
- - emmylua anntations
-
-- luban.client 命令行介绍
- - luban.client 命令行参数
- - job cfg 命令行参数
-
-* 各个语言和引擎及平台下的项目搭建
- - c# + dotnet core
- - c# + unity
- - c# + unity + ILRuntime
- - 其他 c# 平台
- - lua + unity + tolua
- - lua + unity + xlua
- - lua + unity + slua
- - lua + unreal + unlua
- - lua + cocos2dx
- - 其他使用 lua 的 平台
- - c++ + unreal
- - c++ + 其他平台
- - go
- - java
- - python 2.7
- - python 3.0
- - typescript + 微信小游戏
- - typescript + 其他平台
-
-* luban 开发
- - git clone 项目
- - luban 构建与发布
- - 普通构建
- - docker
- - 代码结构介绍
- - 自定义 job
\ No newline at end of file
diff --git a/docs/data_excel.md b/docs/data_excel.md
deleted file mode 100644
index 750e71b..0000000
--- a/docs/data_excel.md
+++ /dev/null
@@ -1,409 +0,0 @@
-[//]: # "Author: bug"
-[//]: # "Date: 2020-11-01 15:40:11"
-
-## bool 类型
-
-用 true 或 false 表示 bool 值,只需要小写后是这两个值即可,比如 true,True,True 都是合法的值。excel 会自动将输入的值大写化。
-
-
-
-|##| id | x|
-|-|-|-|
-|##type|int| bool|
-|| 1| true|
-||2| false |
-
-## float 类型
-
-|##| id | x|
-|-|-|-|
-|##type|int| float|
-|| 1| 1.2|
-||2| 4.895 |
-
-## byte,short,int,long,string
-
- 与 float 相似,不再赘述
-
-## string 类型
-填法与 float相似,但又特殊性。当string类型数据出现在**连续单元格**(比如多列bean占了多个单元格)或者用**sep分割**的数据中时,由于工具无法区别空白到底算空白字符串还是应该跳过,所以在连续多字段模式下,强制用""来表示空白字符串。
-
-下面示例中,s1是string,单独占一个列,可以用空白单元格表示空白字符串。 cs1和cs2要么是连续单元格模式,要么是sep分割产生的连续数据模式,表达空白字符串必须用""。
-
-可能会有疑问,如何恰好想表达 ""是怎么办呢? 如果真遇到这种需求,再寻找解决方案吧。
-
-|##| id | x|
-|-|-|-|
-|##type|int| string|
-|| 1| aaabbb|
-||2| |
-||3| ""|
-
-
-
-
-## text 类型
-
-该类型数据包含两个字段, key和text, 其中 key 可以重复出现,但要求text完全相同,否则报错。这么设计是为了防止意外写重了key。**注意:不允许key为空而text不为空**
-
-如果想填空的本地化字符串, key和text完全留空即可,工具会特殊对待,不会加入 key集合。
-
-text的key和text字段都是string类型,因此在连续单元格或者sep产生的连续数据流模式中,同样要遵循用""来表达空白字符串的规则。
-
-
-|##| id | x&sep=|
-|-|-|-|
-|##type|int| text|
-|| 1| /demo/key1#aaaa|
-||2| /demo/key2#bbbb|
-||3| | |
-
-## datetime 类型
-
-- 时间是常用的数据类型。Luban 特地提供了支持。
- 有两种形式,一种以纯字符串的方式填写。
- - 以纯字符串方式填写
- 填写格式为 以下 4 种。
- - yyyy-mm-dd hh:mm:ss 如 1999-08-08 01:30:29
- - yyyy-mm-dd hh:mm 如 2000-08-07 07:40
- - yyyy-mm-dd hh 如 2001-09-05 07
- - yyyy-mm-dd 如 2003-04-05
- - 以 excel内置的时间格式填写
-
-
-|##| id | x|
-|-|-|-|
-|##type|int| datetime|
-|| 1|1999-09-09 01:02:03|
-||2| 1999-09-09 01:02|
-||3| 1999-09-09 01 |
-||4| 1999-09-09|
-
-## 可空变量
-
-- 有时候会有一种变量,我们希望它 功能生效时填一个有效值,功能不生效里,用一个值来表示。 例如 int 类型,常常拿 0 或者-1 作无效值常量。 但有时候,0 或-1 也是有效值时,这种做法就不生效了。或者说 项目组内 有时候拿 0,有时候拿-1 作无效值标记,很不统一。我们借鉴 sql 及 c#,引入 可空值概念,用 null 表达空值。
-
-|##| id | x| color |
-|-|-|-| - |
-|##type|int| int?|QualityColor?|
-|| 1| 1| A |
-||2| null|B|
-||3| 2|null|
-
-## 列表类型 list,int
-
-|##| id | x|
-|-|-|-|
-|##type|int| list,int|
-|| 1| 12,33,44|
-||2| 10,20,30,40|
-
-## 向量类型 vector2,vector3,vector4
-
-vector3 有三个字段 float x, float y, float z, 适合用于表示坐标之类的数据。
-
-|##| id | x2|x3|x4|
-|-|-|-| -| -|
-|##type|int| vector2|vector3|vector4|
-|| 1| 1,2|11,22,33|12,33,44,55|
-||2| 2,3|22,44,55|6.5,4.7,8.9|
-
-## 枚举类型
-
-- 道具有品质,白绿蓝紫橙。 虽然可以直接填 1-5 这几个数据,但不直观,而且对程序非常不友好。
-- 有一种更优雅的方式是定义枚举。
-- [枚举定义](images/adv/def_09.png)
-
- ``` xml
-
-
-
-
-
-
-
- ```
-
-- 之前用 bean 来定义结构,我们引入的新的 tag “enum” 来定义 枚举。
-- enum 的 name 属性表示 枚举名。
- - 如果生成 c#代码的话,会生成 cfg.item.Equality 类。
-- `` 为检举项。
- - 其中 name 为必填项,不可为空,也不能重复。
- - alias 是可选项,枚举项别名。
- - value 是枚举值,主要给程序使用。
-- [完整用法](images/adv/def_10.png)
- ``` xml
-
-
-
-
-
-
-
-
-
-
-
-
- ```
-- excel 表中,想表达一个枚举值,既可以用检举项 name,也可以用枚举项的 alias,但不能是相应的整数值。
-- 注意!如果想引用其他模块定义的 enum 或者 bean, type 里必须指定全名。
- 比如 type=”mall.TradeInfo” 。
-
-|##| id | color |
-|-|-| - |
-|##type|int| QualityColor?|
-|| 1| GREEN |
-||2| RED|
-||3| 白|
-
-
-## bean 类型
-
-- 有时候希望一个字段是复合类型。
-- 比如,我们想用一个字段 level_range 来表示道具可以使用的等级范围,它包含两个字段,最小等级和最大等级。
-- 此时,可以通过定义 bean 来解决。
- [定义](images/adv/def_12.png)
- ``` xml
-
-
-
-
-
-
-
- ```
-- 之前的字段都在一个单元格内填写,现在这个字段是 bean 类型,有两个值,该怎么填写呢?
- 如果也像 list,int 那样把两个数写在一个单元格里(如下图),会发现工具报错了: “10,20” 不是合法的整数值。
- 
-- 填写这些占据多个单元格的数据有两种办法:
- 1. 合并标题头
- 让 level_range 标题头占据两列,这样就能在两个单元格里分别填写最小最大等级了。
- 
- 2. 使用 sep 分割单元格
- 字段定义中指定 sep 属性,用某些字符分割单元格,这样就能识别为两个整数了。
- [定义](images/adv/def_15.png)
- ``` xml
-
-
-
-
-
-
-
- ```
- 如果想用 分号; 或者 竖号 | 分割,只要 sep=”;” 或者 sep=”|“ 即可。
- 
-
-## list,bean 类型
-
-- 有些时候,我们需要一个 结构列表字段。
- 比如说 道具不同等级会增加不同的血量。我们定义一个 ItemLevelAttr 结构。
- [定义](images/adv/def_17.png)
-
- ``` xml
-
-
-
-
-
-
-
-
-
-
-
- ```
-
- 配置:
- 
-
-- 对于多个值构成的字段,填写方式为 在标题头(level_attrs)对应的列范围内,按顺序填值。不需要跟策划的标题头名有对应关系。空白单元格会被忽略。也就是如下填法也是可以的:
- 
-- 这种填法的缺点是占据在太多的列。如果想如下填,该怎么办呢?
- 
-- 有两种办法。
- 1. bean ItemLevelAttr 增加属性 sep=”,”
- [定义](images/adv/def_21.png)
- ``` xml
-
-
-
-
-
- ```
- 如果不想用逗号”,” ,想用;来分割单元格内的数据,只要将 sep=”;” 即可。
- 2. 字段 level_attrs 增加属性 sep=”,”,即
- [定义](images/adv/def_22.png)
- ``` xml
-
-
-
-
-
-
-
-
- ```
- 如果想所有数据都在一个单元格内填写,又该怎么办呢?
- 
- 想用 | 来分割不同 ItemLevelAttr ,用 , 来分割每个记录的数据。只需要 字段 level_attrs 的 sep=”,|” 即可。
- [定义](images/adv/def_24.png)
- ``` xml
-
-
-
-
-
-
-
-
- ```
-
-## 多态 bean
-
-- 多态 bean 的 Luban 类型系统的核心,没有它就不可能比较方便简洁地表达游戏内的复杂数据。
-- 常见的结构都是固定,但有时候会有需求,某个字段有多种类型,每种类型之间可能有一些公共字段,但它们也有一部分不一样的字段。简单的做法是强行用一个结构包含所有字段,这在类型种类较少时还勉强能工作,但类型很多,字段个数变化极大时,最终的复合结构体过于庞大笨拙,故而难以在实际采用。
-- Luban 引入了 OOP 中类型继承的概念,即多态 bean。方便表达那些复杂配置需求。
-- 假设 item 有一个形状 Shape 类型的字段。Shape 有两种 Circle 和 Rectangle.
- Cicle 有 2 个字段 int id; float radius;
- Rectangle 有 3 个字段 int id; float width; float height;
- [定义](images/adv/def_25.png)
- ``` xml
-
-
-
-
-
-
-
-
-
-
-
-
-
- ```
- 配置:
- 
-- 注意到,多态 bean 与普通 bean 填写区别在于,多态 bean 需要一个类型名。这也好理解,如果没有类型名,如何知道使用哪个 bean 呢。
-- 有时间策划不太习惯填写英文,或者说类型名有时候会调整,不希望调整类型名后配置也跟着改变,因为,多态 bean 支持别名的概念。
- [定义](images/adv/def_27.png)
- ``` xml
-
-
-
-
-
-
-
-
-
-
- ```
-- 配置
- 
-- 使用类型名和别名来标识多态都是支持的,可以混合使用。
-
-## multi_rows 多行 记录
-
-- 使用数据表经常会遇到某个字段是列表类型的情形。有时候列表的 bean 的字段特别多,比如多达 10 个字段,列表包含了好几个 bean。如果此时配置成一行,会导致 excel 列过多,策划编辑维护不方便直观。 Luban 支持这个列表 多行配置。
-- [定义](images/adv/def_29.png)
- ``` xml
-
-
-
-
-
-
-
-
-
-
- ...
-
-
- ```
-- 和 普通 非多行记录的区别在于 lines 字段多了一个 multi_rows=”1” 字段,表示这个字段要多行配置。
-- 
-
-## 多级标题头
-
-- 经常会有字段占了多列,比如 Shape, 如果按顺序填写,有个问题在于,字段很多时,容易对应错误,不方便定位。
-- 假设 有个 show_info 字段,包含 如下字段 string name; string desc; string tip;
-- [定义](images/adv/def_31.png)
- ``` xml
-
-
-
-
-
-
- ...
-
-
- ```
-- 配置
- 
-- 有几处改动
- 1. 我们新插入了一行标题头,第 2 行变成了两行。同时 A2,A3 单元格合并,表示标题头占了 2 行。
- 2. show_info 下一行,填上 子字段名 (顺序不重要)
-- 我们称之为多级标题头,通过多级标题头的方式,可以精确定位深层次字段的列。方便策划填。
-
-## 单例表
-
-- 不是所有数据都是 类似 map 这样的多记录结构。有些配置只有一份,比如 开启装备系统的最小角色等级。 这些数据 所在的表,也只有一个记录。称之为 单例表。
-- 我们创建一个单例表,来存放这些数据。
-- [定义](images/adv/def_33.png)
- ``` xml
-
-
-
-
-
- ```
-- 配置
- 
-
-## 横表与纵表
-
-- 之前介绍的表都是 面向行,沿着行方向填写数据。有时候我们希望 以列为方向填写。
-- 比如 上面的单例表。 如果改成一行一个字段,看起来会更清楚。 我们引入纵表支持。
-- 定义不变,但 excel 的填法有区别,数据如下:
-- 
-
-
-## 默认值
-
-该特性只对excel格式文件有效。当单元格为空时,该字段使用默认值。
-
-```xml
-
-
-
-
-
-
-
-```
-
-
-
-## convert 常量替换
-
-游戏里经常会出现一些常用的类似枚举的值,比如说 升级丹的 id,在很多地方都要填,如果直接它的道具 id,既不直观,也容易出错。 Luban 支持常量替换。对于需要常量替换的字段,添加 convert=”枚举类”。 如果填写的值是 枚举名或者别名,则替换为 相应的整数。否则 按照整数解析。
-
-定义
- ``` xml
-
-
-
-
-
-
-
- ```
-
-配置:
-
- 
diff --git a/docs/data_json.md b/docs/data_json.md
deleted file mode 100644
index e23ca73..0000000
--- a/docs/data_json.md
+++ /dev/null
@@ -1,126 +0,0 @@
-[//]: # (Author: bug)
-[//]: # (Date: 2020-11-01 16:26:41)
-
-# json 数据源
-
-## json数据格式
-
-
-大多数数据格式填法符合直觉,有几个数据类型的格式比较特殊:
-- set类型。填法为 [v1,v2,...]
-- map类型。由于json只支持string类型的key,因此map格式填法为 [[k1,v1],[k2,v2]...]
-- 多态bean类型。需要 \_\_type\_\_ 属性来指定具体类型名。
-- text类型,填法为 {"key":key, "text":text}
-
-不同数据结构在json中格式示例如下:
-
-```xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-示例json文件内容如下
-
-```json
- {
- "x1":true,
- "x2":3,
- "x3":128,
- "x4":1,
- "x5":11223344,
- "x6":1.2,
- "x7":1.23432,
- "x10":"hq",
- "t1": {"key":"/key/xx1","text":"apple"},
- "x12": { "x1":10},
- "x13":"B",
- "x14":{"__type__": "DemoD2", "x1":1, "x2":2},
- "v2":{"x":1, "y":2},
- "v3":{"x":1.1, "y":2.2, "z":3.4},
- "v4":{"x":10.1, "y":11.2, "z":12.3, "w":13.4},
- "t1":"1970-01-01 00:00:00",
- "k1":[1,2],
- "k2":[2,3],
- "k7":[2,3],
- "k8":[[2,2],[4,10]],
- "k9":[{"y1":1, "y2":true},{"y1":2, "y2":false}],
- "k15":[{"__type__": "DemoD2", "x1":1, "x2":2}]
- }
-```
-
-## 以复合json文件形式组织
-
-整个表以一个或者多个json文件的形式组织。在table的input属性中手动指定json数据源,有以下几种格式:
-- xxx.json,把xxx.json当作一个记录读入。
-- *@xxx.json,把xxx.json当作记录列表读入。
-- field@xxx.json,把 xxx.json中的field字段当作一个记录读入。field可以是深层次字段,比如 a.b.c。
-- *field@xxx.json,把xxx.json中的field字段当作记录列表读入。field可以是深层次字段。
-
-比较有趣的是,与xlsx数据源相似,支持将多个表放到同一个json中,不过实践中极少这么做。
-
-如下列示例:
-
-- TbCompositeJsonTable1 从 composite_tables.json的table1字段中读入记录列表,从composite_tables2.json中读入记录列表,从one_record.json中读入一个记录
-- TbCompositeJsonTable2 从 composite_tables.json的table2字段中读入记录列表
-- TbCompositeJsonTable3 从 composite_tables.json的table3字段中读入一个记录
-
-
-```xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-## 以目录树形式组织
-典型用法是,以目录为数据源(会遍历整棵目录树),目录树下每个json文件为一个记录读入。
-
-如下,递归遍历test/json_datas整个目录树,**按文件名排序后**依次将每个json数据当作一个记录读入。
-
-```xml
-
-```
-
-## 数据tag
-与excel格式类似,json格式支持记录tag,用 \_\_tag\_\_ 属性来指明tag,示例如下:
-
-```json
-{
- "__tag__":"dev",
- "x":1,
- "y":2
-}
-```
-
-
diff --git a/docs/data_lua.md b/docs/data_lua.md
deleted file mode 100644
index 3aad560..0000000
--- a/docs/data_lua.md
+++ /dev/null
@@ -1,91 +0,0 @@
-[//]: # (Author: bug)
-[//]: # (Date: 2020-11-01 16:26:41)
-
-# Lua 数据源
-
-## json数据格式
-
-大多数数据格式符合直觉,有几个特殊点:
-* 数据前有一个return,这是因为 lua 数据是当作 lua 文件加载的,每个加载后的结果当作一个记录读入。
-* set 的格式为 {v1, v2, ...}
-* 与json不同,lua 的table的key支持任意格式,所以lua的map可以直接 {[key1] = value1, [key2] = value2, ,,,}
-* text类型,填法为 {key = key, text = text}
-
-
-定义
-
-```xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-示例数据
-
-```lua
-return
-{
- x1 = false,
- x2 = 2,
- x3 = 128,
- x4 = 1122,
- x5 = 112233445566,
- x6 = 1.3,
- x7 = 1122,
- x10 = "yf",
- t1 = {key="/key/ab1", text="apple"},
- x12 = {x1=1},
- x13 = "D",
- x14 = { __type__="DemoD2", x1 = 1, x2=3},
- v2 = {x= 1,y = 2},
- v3 = {x=0.1, y= 0.2,z=0.3},
- v4 = {x=1,y=2,z=3.5,w=4},
- t1 = "1970-01-01 00:00:00",
- k1 = {1,2},
- k2 = {2,3},
- k8 = {[2]=10,[3]=12},
- k9 = { {y1=1,y2=true}, {y1=10,y2=false} },
- k15 = { { __type__="DemoD2", x1 = 1, x2=3} },
-}
-```
-
-## 以复合lua文件形式组织
-
-整个表在一个或者多个lua文件中组织。用法与json数据源相似,参见 [json数据源](./data_json.md)
-
-## 以目录树形式组织
-
-典型用法是,以目录为数据源(会遍历整棵目录树),目录树下每个lua文件为一个记录读入。如下示例,递归遍历test/lua_datas整个目录树,**按文件名排序后**依次将每个lua数据当作一个记录读入。
-
-```xml
-
-```
-
-## 数据tag
-与excel格式类似,也支持记录tag,用 \_\_tag\_\_ 属性来指明tag,示例如下:
-
-```lua
-return {
- __tag__ = "dev",
- x = 1,
- y = 2,
-}
-```
\ No newline at end of file
diff --git a/docs/data_xml.md b/docs/data_xml.md
deleted file mode 100644
index c1e10ae..0000000
--- a/docs/data_xml.md
+++ /dev/null
@@ -1,64 +0,0 @@
-[//]: # (Author: bug)
-[//]: # (Date: 2020-11-01 16:26:41)
-
-### json 数据源
-
-```xml
-
-
-
-
-
-
-
-
-
- 多态数据结构
-
-
-
-
- 使用;来分隔
-
-
-
-
-
-
-
-```
-
-递归遍历test/xml_datas整个目录树,**按文件名排序后**依次将每个xml数据当作一个记录读入。其中1.xml文件内容如下
-
-```xml
-
- true
- 4
- 128
- 1
- 112233445566
- 1.3
- 1112232.43123
- yf
- 1
- C
- 1 2
- 1,2
- 1.2,2.3,3.4
- 1.2,2.2,3.2,4.3
- 1970-01-01 00:00:00
- - 1
- 2
- - 1
- 2
-
- - 210
- - 330
-
-
- - 1 true
- - 2 false
-
-
- - 1 2
-
-
-```
\ No newline at end of file
diff --git a/docs/data_yaml.md b/docs/data_yaml.md
deleted file mode 100644
index 68db7a6..0000000
--- a/docs/data_yaml.md
+++ /dev/null
@@ -1,94 +0,0 @@
-[//]: # (Author: bug)
-[//]: # (Date: 2020-11-01 16:26:41)
-
-# yaml 数据源
-
-
-## 以复合数据形式组织
-
-整个表在一个或者多个yaml文件中组织。用法与json数据源相似,参见 [json数据源](./data_json.md)
-
-## 以目录树形式组织
-
-```xml
-
-
-
-
-
-
-
-
-
- 多态数据结构
-
-
-
-
- 使用;来分隔
-
-
-
-
-
-
-
-```
-
-递归遍历test/yaml_datas整个目录树,**按文件名排序后**依次将每个yaml数据当作一个记录读入。其中1.yml文件内容如下
-
-```yaml
----
-x1: true
-x2: 3
-x3: 128
-x4: 40
-x5: 11223344
-x6: 1.2
-x7: 1.23432
-x10: hq
-x12:
- x1: 10
-x13: B
-x14:
- __type__: DemoD2
- x1: 1
- x2: 2
-s1:
- key: "/key32"
- text: aabbcc22
-v2:
- x: 1
- y: 2
-v3:
- x: 1.1
- y: 2.2
- z: 3.4
-v4:
- x: 10.1
- y: 11.2
- z: 12.3
- w: 13.4
-t1: '1970-01-01 00:00:00'
-k1:
-- 1
-- 2
-k2:
-- 2
-- 3
-k8:
-- - 2
- - 2
-- - 4
- - 10
-k9:
-- y1: 1
- y2: true
-- y1: 2
- y2: false
-k15:
-- __type__: DemoD2
- x1: 1
- x2: 2
-
-```
diff --git a/docs/deploy.md b/docs/deploy.md
deleted file mode 100644
index e048a76..0000000
--- a/docs/deploy.md
+++ /dev/null
@@ -1,20 +0,0 @@
-[//]: # (Author: bug)
-[//]: # (Date: 2020-11-23 00:21:21)
-
-# 服务端布署
-
-## Docker 镜像布署
-- 镜像会自动更新至最新版
-- 在有 docker 的环境下,执行下面的指令
-``` bash
- docker pull hugebug4ever/luban:latest
- docker run --name luban-server -d -p 8899:8899 hugebug4ever/luban:latest
-```
-
-## Windows 下命令行布署
-- 下载 [release](https://github.com/focus-creative-games/luban/releases) 版本
-- 解压 Luban.Server.zip
-- 执行下面的命令即可
-```
- Luban.Server.exe
-```
\ No newline at end of file
diff --git a/docs/faq.md b/docs/faq.md
deleted file mode 100644
index 5c09b66..0000000
--- a/docs/faq.md
+++ /dev/null
@@ -1,26 +0,0 @@
-[//]: # "Author: bug"
-[//]: # "Date: 2020-11-15 23:59:21"
-
-===============================================================================
-
-## 为什么要使用"客户端/服务器"模式
-
-- 最初的想法是服务端闭源,因为代码生成部分花了很多心思,也方便加密之类的操作
-- 为了方便与社区开发者交流开源后,还保留了这一模式,因为觉得
- - 这一模式,也能作为 ddc 的基础 (distributed data cache)
- - 配置文件需要反复生成与测试
- - 文件数量上升后,配置生成不可避免地变慢
- - 再快的技术,也挡不住大量数据的处理
-
-## 如果用客户端生成,再通过服务器端分享缓存,不是更快么
- - 是的。
- - 但服务器模式还有方便更新的优势,就像网页访问,不需要每个客户端升级浏览器。
- - 通知每个使用者要更新本地目录这件事,在实践中也产生过很多麻烦。
- - 如果有效率提升,更佳的 feature (比如统计?), 在服务端实施更方便。
- - c-s 本身是个流行的设计,虽然万物皆可客户端 ^_^。
- - 考虑至此,就没有继续深究这个问题。
-
-## 为什么 excel 的配置不像别的工具,用文件头描述数据?
-- 数据描述除了 excel 还可以为 json 等其它数据源。用 xml 可以更统一。
-- 数据类型可以描述地更详细,毕竟 excel 的表达只是强在数据。
-- 数据关系可以更好地表达,比在 excel 中用一些技巧实现更舒服。
diff --git a/docs/feature.md b/docs/feature.md
deleted file mode 100644
index 8f92633..0000000
--- a/docs/feature.md
+++ /dev/null
@@ -1,199 +0,0 @@
-[//]: # (Author: bug)
-[//]: # (Date: 2020-10-18 15:35:26)
-
-## 特性说明
---------------------
-
-### 支持的数据类型
-* 基础内置类型
- - bool,byte,short,fshort,int,fint,long,flong,float,double,string,text,bytes
- - vector2, vector3,vector4
- - datetime
-* 可空类型
- - bool?,byte?,short?,fshort?,int?,fint?,long?,flong?,float?,double?
- - vector2?,vector3?,vector4?
- - datetime?
-* 自定义枚举 enum
-* 自定义常量 const
-* 自定义结构 bean
- - 可以定义所有类型的字段
- - 支持无限制的结构继承,对于表达中大型项目的复杂数据(技能,buff,ai 等等) 极其有用。 (比如基类Shape, 子类 Circle,Rectangle
-```mermaid
-graph TD;
- A-->B;
- A-->C;
- B-->D;
- B-->E;
-```
-* 支持容器类型 array。 value 可以为内置类型,也可以为自定义类型
-* 支持容器类型 list。 value 可以为内置类型,也可以为自定义类型
-* 支持容器类型 set。 value 只能为内置类型或者enum类型,不支持 bean 类型
-* 支持容器类型 map。 key 只能为内置类型或者enum类型,不支持 bean 类型。 value 可以为内置类型,也可以为自定义类型
-
-### 多数据源支持
-* 支持excel族。 csv 及 xls,xlsx等格式
-* 支持从指定excel里的某个单元薄读入。
-* 支持json。 每个json文件当作一个记录读入
-* 支持lua。 每个lua文件当作一个记录读入
-* 支持xml。 每个xml文件当作一个记录读入
-* 支持目录。 递归目录下的所有文件,每个文件当作一个记录读入。允许不同类型的文件混合,比如目录下可以同时有json,lua,xml,excel之类的格式。
-* 允许指定多个数据源,可以使用以上所有的组合。
-* 扩展新的数据源也非常容易 (像支持lua,json,xml数据源只用了200行左右代码)
-
-### 多种数据表模式
-
-* one 格式,即单例表模式
-* map 格式,即普通key-value表模式。 任何符合set 的value要求的类型都可以做key
-* bmap 格式,即双主键模式。 任何符合 set 的value要求的类型都可以作 key1和key
-
-### 分组导出
-
-在大多数项目中,导出给前后端的数据并非完全相同。有些表可能仅仅前端或者后端需要,有些字段也可能仅仅前端或者后端需要。 luban同时支持两种级别的分组:
-#### 表级别分组
-
-定义方式为在table中定义group属性,如果未定义 group,则默认导出给所有分组,如果定义group,则只导出给指定分组,可以多个,以逗号","分隔。
-
-例如: TbDemoGroup_C表只给客户端使用, TbDemoGroup_S只能服务器使用, TbDemoGroup_E只给editor使用。
-定义如下:
-
-
-
-#### 字段级别分组
-
-定义方式为给var指定group属性,未指定则默认导出给所有分组。可以为多个,以逗号","分隔。相比于大多数导表工具只支持**表顶级字段**的分组导出,luban支持任意bean字段粒度级别的分组导出。
-
-例如, TbDemoGroup表中 id,x1,x4 字段前后端都需要; x3 只有后端需要;x2 字段只有前端需要。x5是bean类型,它导出给前后端,但它的子字段也可以被分组过滤, x5.y1, x2.y4前后端都会导出,x5.x3只导出给后端,x5.x2只导出给前端。
-定义如下:
-
-
-
-
-### 生成极快
-* 大项目几十M配置数据也能1秒导出
-* 生成工具使用客户端/服务器架构
-* 服务器使用多线程加速生成,数十倍提高生成速度
-* 服务器使用缓存直接返回未改动的代码或者数据的生成结果
-* 支持增量生成
-
-### 增强的 excel 格式
-* 支持填写任意复杂的数据(比如 常见的 list,bean 这种类型)
-* 支持 sep 在单个单元格内填写多个数据
-* 支持 多行数据。即 对于 list,bean 类型的字段,可以多行填写
-* 支持多级标题头,对填写 层次很深的数据时非常有用
-* 支持导出标记。比如 是、否、test 等等,用于标记某行数据是否导出
-* 支持用 true,false表示 bool 值,语义更清晰。
-* 支持枚举 alias 别名,填写枚举类型不再需要写数字了
-* 支持可空变量。可以用null表达空。 某些场合下语义更清晰。
-* 支持 datetime 数据类型. 时间格式标准为以下几种,最终被转化为utc时间方便程序处理
- - yyyy-MM-dd HH:mm:ss
- - yyyy-MM-dd HH:mm
- - yyyy-MM-dd HH
- - yyyy-MM-dd
-
-### 代码编辑器支持
-* 根据配置表定义生成相应的json文件的 load 及 save 代码(c#或者c++),方便编辑器加载和导出。每个记录对应一个json文件。
-* 支持 unity 下用c# 开发编辑器
-* 支持 unreal 下用c++ 开发的编辑器
-
-### 多数据源
-支持表数据来自excel文件;来自excel某个单元薄;来自json、xml、yaml文件;来自目录下所有文件。以及以上几种的组合。
-#### 来自某个excel文件
-```xml
-
-```
-#### 来自某个excel单元薄
-```xml
-
-```
-####
-#### 一个数据表来自两个excel文件
-通过 excel文件1,excel文件2... 的方式指定数据表的数据来自多个文件,不同文件以逗号","分隔。当数据源为excel文件,并且没有用@来指定某个单元表时,该excel文件的中的所有单元表都会被读入。例如TbItem表的数据来自item目录下的item1.xlsx和item2.xlsx。
-
-```xml
-
-```
-
-#### 两个数据表来自同一个excel文件的不同单元表
-通过 <单元表名>@excel文件的方式指定数据来自excel文件的某个单元表,可以指定多个单元表,通过逗号","分隔。示例中TbItem占了table1、table3两个单元表;TbEquip占了table2、table4两个单元表。同一个数据表占据的单元表不必连续。示例中故意让TbItem和TbEquip占了不相邻的两个单元表。
-
-```xml
-
-
-```
-
-#### 一个数据表的数据来自**目录**下的所有文件
-当以目录为数据源时,会遍历整个目录树中所有文件,除了文件名以 ",.~"(字符逗号或点号或波浪号)开头的文件外,读入每个文件中的数据。如果是excel族的数据,会从每个文件中读取多个记录,如果是xml、lua、json族的数据,每个文件当作一个记录读入。 可以有指定多个目录同时为数据源,以逗号","分隔。
-```xml
-
-```
-
-### 支持多种导出数据格式
-* **导出格式与源数据解耦**。无论源数据是 excel、lua、xml、json 或者它们的混合, 最终都被以统一的格式导出,极大简化了生成代码的复杂性。
-* 导出binary。 内置binary格式,加载最快,占空间最少。
-* 导出json 格式
-* 导出 lua 格式
-* 非常容易扩展其他输出格式(一般来说不到300行代码)
-
-### 本地化支持
-* 支持**本地化时间**。 配置中的 datetime会根据指定的timezone及localtime转化为正确的utc时间,方便程序处理
-* 支持**静态本地化**。 配置中的text类型在导出时已经转化为正确的本地化后的字符串
-* 支持**动态本地化**。 配置中的text类型能运行时全部切换为某种本地化后的字符串
-
-### 代码编辑器支持
- * 支持 emmylua anntations。生成的lua包含符合emmylua 格式anntations信息。配合emmylua有强大的配置代码提示能力。
-
-### 强大的数据校验能力
-* 完整的数据内建约束检查
-* ref 检查。检查表引用合法性。
-* path 检查。检查资源引用合法性,对于防止策划填错极其有用,不再需要运行时才发现资源配置错误了。
-* range 检查。检查数值范围。
-* 扩展的自定义检查。使用自定义代码进行高级检查。提交配置前就能完成本地检查,避免运行时才发现错误,极大减少迭代成本。
-
-### 资源导出支持
-* 支持 res 资源标记。可以一键导出配置中引用的所有资源列表(icon,ui,assetbundle等等)
-
-
-### 优秀的代码生成
-- 良好模块化。比如对于c#语言生成cfg.item.Item,cfg.equip.EquipInfo这样的类
-- 内存性能优化。支持c#值类型以及lua的紧凑格式保存数据,节约内存。
-- 支持为ref的字段生成resolve后的字段定义及加载后设置。读取所引用的字段不用再查表了。
-- 支持对 list 类型数据 生成 index, 方便按列表和索引方式访问的需求。
-
-
-### 良好的数据组织
-- 数据模块化。允许策划按模块目录自由组织数据。
-- 数据多源化。允许策划按需求选择最合适的源数据类型。
-
-### 支持的语言 (覆盖主流的语言)
-* 支持 c# (所有 .net framework 2 及以上, .net core平台)
-* 支持 java (java 1.6 及以上)
-* 支持 c++ ( c++ 11 及以上)
-* 支持 go
-* 支持 lua (5.1 及以上)
-* 支持 typescript
-* **新增其他语言支持非常容易**
-
-### 支持的服务器引擎(满足语言版本的情况下)
-* 纯 c# 的所有引擎
-* 纯 java 的所有引擎
-* 纯 go 的所有引擎
-* 纯 c++ 的所有引擎
-* 纯 lua 的所有引擎
-* 纯 js或typescript的所有引擎
-
-### 支持的客户端引擎(满足语言版本的情况下)
-* unity + c#
-* unity + tolua
-* unity + xlua
-* unity + ILRuntime
-* cocosx-lua
-* cocosx-js
-* unreal + 纯 c++
-* unreal + unlua
-* unreal + puerts (typescript)
-* 支持微信小程序和小游戏 sdk
-* 支持 lua 的其他任何引擎
-* 支持 js 或 typescript的 其他任何引擎
-
-### 强大的扩展能力
-* 支持插件形式,扩展其他生成极其方便
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index 899261b..0000000
--- a/docs/index.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# 欢迎使用 Luban
-
-
-## 介绍
-
-Luban 是一个强大的生成与缓存工具。最初只用于对象生成,对象可以是常规代码、配置数据、类似protobuf的消息代码,也可以是游戏资源如assetbundle。
-在大型项目中,由于配置或资源数据庞大,生成对象可能会花费相当多的时间。比如一个典型的MMORPG项目,后期全量生成配置,即使用了多线程加速,所需时间
-也在10秒的级别。因此使用client/server模式配合缓存机制来大幅加速生成过程。
-
-Luban 最初是为了解决传统excel导出工具功能过于薄弱,无法很好解决MMORPG游戏复杂配置需求的痛点问题。 自2015年以来,经历过 MMORPG、卡牌、SLG 等多个上线项目的考验,
-实际项目过程中不断迭代和优化,理解逐渐深入,最终由一个增强型的配置工具成为一个 **相对完备的游戏配置数据解决方案**。
-
-## 文档
-* [目录](docs/catalog.md)
-
-## 支持和联系
-
-QQ 群 : 692890842
-QQ 群名 : Luban 开发交流群
-邮箱 : taojingjian#gmail.com
-
-
diff --git a/docs/l10n.md b/docs/l10n.md
deleted file mode 100644
index c409447..0000000
--- a/docs/l10n.md
+++ /dev/null
@@ -1,157 +0,0 @@
-## 本地化
-支持多种本地化机制,分别处理不同的场合,它们可以同时使用。
-### 静态文本值本地化
-对于需要本地化的文本值,在配置导出时既已完成本地化的转化,适用于不同地区打不同包或者不同配置的情形。通过以下几个方面来实现静态文本值本地化:
-- 使用 text 类型标识需要本地化的字符串。 text类型由两个字段构成, key和value。
-- 使用本地化映射表提供text到其他语言的映射
-- 未完成本地化的text单独输出到一个文件,方便得知哪些文本值未完成本地化映射
-
-#### 需要本地化的示例表
-
-
-
- | ## |
- id |
- name |
- desc |
- count |
-
-
- | ##type |
- int |
- text |
- string |
- int |
-
-
- |
- 1 |
- /demo/key1 | 苹果 |
- 这是一个苹果 |
- 100 |
-
-
- |
- 2 |
- /demo/key2 | 香蕉 |
- 这是香蕉 |
- 100 |
-
-
- |
- 3 |
- /demo/key3 | 西瓜 |
- 这是西瓜 |
- 100 |
-
-
-
-#### 文本值映射文件
-
-
-| ## | key | origin_text | text_tw | text_en |
-| - | - | - | - | - |
-|##type|string|string|string|string|
-|##|本地化key| 原始值 | 繁体值 | 英文 |
-||/demo/key1|苹果|苹果|apple|
-||/demo/key2|香蕉|香蕉|banana|
-
-### Luban.Client 命令
-有三个参数跟静态文本值本地化相关
-- input_l10n_text_files 本地化映射文件
-- l10n_text_field_name 映射的目标字段名。因为有可能多个语言都在同一个映射表内(如text_tw和text_en)
-- output_l10n_not_translated_text_file 未完成文本值本地化映射的text
-
-以下为一个示例脚本
-```bat
-%GEN_CLIENT% -h %LUBAN_SERVER_IP% -j cfg --^
- -d %DEFINE_FILE%^
- --input_data_dir %CONF_ROOT%\Datas ^
- --output_code_dir Gen ^
- --output_data_dir config_data ^
- --gen_types data_json ^
- -s all ^
---input_l10n_text_files l10n/cn/TextTable_CN.xlsx ^
---l10n_text_field_name text_en ^
---output_l10n_not_translated_text_file NotLocalized_CN.txt
-```
-
-### 示例输出结果
-
-导出json文件内容为
-
-```json
-[
- {
- "id": 1,
- "text": {
- "key": "/demo/key1",
- "text": "apple"
- },
- "desc": "这是一个苹果",
- "count": 100
- },
- {
- "id": 2,
- "text": {
- "key": "/demo/key2",
- "text": "banana"
- },
- "desc": "这是香蕉",
- "count":100
- },
- {
- "id": 3,
- "text": {
- "key": "/demo/key3",
- "text": "西瓜"
- },
- "desc":"这是西瓜",
- "count": 100
- }
-]
-```
-
-示例中 /demo/key3 在本地化映射表中未提供,因为output_l10n_not_translated_text_file 指定的未映射本地化文本值列表内容为。
-
-```text
-/demo/key3|这是西瓜
-```
-
-
-### 文本值动态本地化
-
-运行时动态切换text类型字段到目标语言,程序不需要根据id去本地化映射表里查询,简化了使用。注意,目前只有bean中text类型字段才支持,像list,text之类的暂未支持。通过以下几个方面支持文本值动态本地化:
-- 标识字段为text类型
-- 提供 (string key, string origin_value) => (string target_value) 的本地化映射函数
-- 运行时调用 cfg.Tables.TranslateText函数,一键切换配置中所有text类型值到目标语言
-
-本地化映射函数实现比较简单,核心在于如何制作文本值本地化映射配置?使用者既可以使用自定义本地化映射表,可以使用普通的 luban配置表来提供 文本值映射配置,如下图:
-|##| key | origin_text | text_tw | text_en |
-|-| - | - | - | - |
-|##type| string| string| string| string|
-|##|本地化key| 原始值 | 繁体值 | 英文 |
-||/demo/key1|苹果|苹果|apple|
-||/demo/key2|香蕉|香蕉|banana|
-
-假设想切换到en,配置表的表名为 l10n.TbTextMapper,示例c#版本地化映射函数如下:
-```c#
-string TextMapper(string key, string originText)
-{
- return tables.TbTextMapper.GetOrDefault(key)?.TextEn ?? originText;
-}
-```
-
-### 多分支 数据
-支持 main + patches的数据模式。在主版本数据基础上,提供一个补丁数据,合并处理后生成最终目标数据。适合制作海外有细节配置不同的多地区配置,不需要
-复制出主版本数据,接着在上面修改出最终数据。极大优化了制作本地化配置的工作流。
-
-
-### 时间本地化
-datetime类型数据在指定了本地化时区后,会根据目标时区,生成相应时刻的UTC时间,方便程序使用.
-
-通过Luban.Client的参数来指定时区:
-
- -t,--l10n_timezone
-
-该时区为linux下的时区名,例如: -t "Asia/Shanghai" 指定目标时区为 亚洲上海(也即北京时间)
diff --git a/docs/luban_command_tools.md b/docs/luban_command_tools.md
deleted file mode 100644
index 15c8e0c..0000000
--- a/docs/luban_command_tools.md
+++ /dev/null
@@ -1,239 +0,0 @@
-
-## 部属
-
-Luban工具有两种部属方式。
-
-### 方法1: Luban.Client与Luban.Server独立部属,云生成模式
-
-#### 部属 luban-server
-
-- 基于 docker (强烈推荐以这种方式在服务器上部属luban-server,因为可以充分利用缓存机制大幅缩短生成时间)
-
- docker run -d --rm --name luban-server -p 8899:8899 focuscreativegames/luban-server:latest
-
-- 基于 .net 6 runtime (可跨平台,不需要重新编译)
- - 自行安装 .net 6 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-client
-- 基于 docker (只推荐与jenkins之类devops工具配合使用,因为docker容器启动会增加一定的延迟)
-
- docker run --rm -v $PWD/.cache.meta:/bin/.cache.meta focuscreativegames/luban-client <参数>
-
- 提醒! .cache.meta这个文件用于保存本地生成或者提交到远程的文件md5缓存,**强烈推荐** 添加-v $PWD/.cache.meta:/bin/.cache.meta 映射,不然每次重新计算所有涉及文件的md5,这可能在项目后期会造成多达几秒的延迟。
-- 基于 .net 6 runtime (推荐win平台使用,可跨平台,不需要重新编译)
- - 自行安装 .net 6 runtime.
- - 从[示例项目](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 ) 选项及其参数**。
-
- Luban.ClientServer是Luban.Client的功能超集,可以完全替代Luban.Client。
-
-
------
-## 使用
-
-### luban-server 使用介绍
-
-命令行使用
-
- dotnet Luban.Server.dll [-p ] [-l ]
-
- 参数介绍:
- -p, --port 可选参数。 监听端口 ,默认为8899。
- -l, --loglevel 可选参数。 日志级别。默认为INFO。 有效值有: TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
- -t, --template_search_path 可选参数。模板的额外搜索路径。优先从此路径,再从Templates目录搜索模板文件。
- --disable_cache 可选参数。禁用生成中间过程的缓存,但保留了源文件缓存。在模板调试时比较有用。
- --i10n:default_timezone 可选参数。 datetime时间所在的时区。如果未设置则会尝试用"Asia/Shangehai"和"China Standard Time"。
-
- 关于时区,win下可使用命令"tzutil /l" 查看本机时区列表。 也可查阅MS文档[default-time-zones列表](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-time-zones?view=windows-11)
-
-## luban-client 使用介绍
-
- 命令行使用
-
- dotnet Luban.Client.dll [-h ] [-p ] [-l ] [-c ] [-w ] [-h ] -j cfg --
-
- 参数介绍:
- -h,--host 可选参数。 luban-server的地址。默认为 127.0.0.1
- -p,--port 可选参数。 luban-server的端口。默认为 8899
- -j,--job 必选参数。 生成类型。目前支持的生成类型有: cfg,proto,db。 生成配置请取cfg。
- -l,--loglevel 可选参数。 日志级别。默认为INFO。有效值有: TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
- -c,--cachemetafile 可选参数。 meta缓存文件名。 默认为 .cache.meta
- -w,--watch 可选参数。 监测目录或者目录列表,以逗号';'分隔。当开启此选项后,生成结束后不会退出程序,而是进入自动生成模式。监听到目标目录发生变化后,自动重新运行生成。省去改动后手动运行生成脚本的麻烦。
- --generateonly 可选参数。 仅生成。不从服务器下载生成结果。可以用于检查服务器是否能成功生成。
- -h,--help 可选参数。显示帮助信息
- -- 必选参数。 从此参数起,便是 不同job的特有选项
-
-----
-
- cfg的介绍:
-
- -d,--define_file 必选参数。 根定义文件名。
- --input_data_dir 必选参数。 配置数据文件根目录。
- --input_convert_dir 可选参数。 执行json、lua、xlsx之类数据格式转换时,提供的数据源,覆盖table中默认的input参数。
- -c,--output_code_dir