跳到主要内容
版本:classic

配置定义

定义由两类文件构成

  • 根定义文件 文件名一般为root.xml或者 __root__.xml。包括topmodule,branch,group,import,service等等设置项。
  • 子定义文件 包含配置表相关的定义。包括table, bean, enum定义。配置表定义既可以在xml中配置,也可以在excel文件中定义,每个项目可根据偏好自由选择,甚至可以同时存在。

根定义文件

root.xml是定义的根文件,luban从root.xml直接和间接获得所有的定义相关数据。root.xml中定义了一些生成的设置参数,以及通过import和importexcel 指明了具体的配置表定义相关的定义文件。

root.xml包含以下设置项:

topmodule

指定了顶层命名空间。为会所有生成的代码类添加此顶层命名空间,避免生成的代码与其他其他代码产生定义冲突。

topmodule参数可选,默认为空。不过一般推荐值为cfg。

<topmodule name="cfg"/>

option

指定一些额外的自定义选项或参数。 option可以有0到多个。

  <option name="platform" value="win"/>
<option name="editor.topmodule" value="editor.cfg"/>

name和value都是必选参数。

option参数能在代码与数据scriban模板中访问。

  • has_option 'xxx' 检查是否存在对应选项。
  • get_option 'xxx' 获得某个选项对应的value值。
  • get_option_or 'option_name' 'default_value" 获取某个选项的值,如果不存在,则取默认值

目前已经定义了一些内部option

  • editor.topmodule cs_unity_editor_json生成的代码的顶层命名空间,默认为 editor.{top_module}
  • cpp_bin.output_all_types_file cpp_bin 输出的包含所有类型的文件的名称,默认gen_types.h
  • cpp_bin.type_per_stub_file cpp_bin 每个stub文件包含的类型个数。默认100
  • cppbin.stub_file_name_format cpp_bin stub文件的格式。默认 gen_stub{0}.cpp
  • cpp_ue_editor_json.type_per_stub_file cpp_ue_editor_json 每个stub文件包含的文件个数,默认200
  • cppue_editor_json.stub_file_name_format cpp_ue_editor_json的stub文件名格式,默认gen_stub{0}.cpp

patch

用于本地化,制作有细微区别的多地区配置数据。可以有0个或者多个。

<patch name="cn"/>
<patch name="en"/>

group

实际项目中往往需要为某此table或bean中的字段指定只对服务器或客户端导出,分组机制用于解决这个问题。目前支持两种粒度的分组:表级别分组和字段级别分组。

group用于定义一个分组,配置表定义中指定的分组必须为这些在root.xml提前定义好的分组。可以有0到多个分组,实际的游戏项目中,一般至少会定义c,s这两个分组。

name的值可以有多个,以','分割,填写分组名时,其中任意一个值都可以代表这个分组。例如name="c,cleint",这是为了方便填写分组名,毕竟写c比client更不容易写错 。

default参与用于表示 如果table未指定group,是否默认属于此分组。 default=1表示未设置group属性的table,默认属于此分组。

<group name="c,client" default="1"/>
<group name="s,server" default="1"/>
<group name="e" default="1"/>

import

导入xml格式的子定义文件。即可以是具体的某个xml文件,也可以是目录(自动遍历该目录树,加载所有xml定义)。可以有0到多个。

<import name="item.xml"/>
<import name="."/>

importexcel

导入excel格式的子定义文件。与xml定义文件不同,xml定义文件中可以同时包含enum、bean、table定义,而excel格式的定义文件,相应分enum,bean,table 三种类型,每种类型的文件只能定义一种结构。 每个类型的定义文件都可以有0到多个。

  • name属性指定了导入的excel定义文件名,注意,理论上为了统一,excel定义文件应该放到定义目录下,但为了照顾大多数使用者的习惯,定义文件的 查找路径为--input_data_dir 选项指定的目录。

  • type属性指明了定义类别。可取 enum,bean,table。

<importexcel name="bean.xlsx" type="bean"/>
<importexcel name="enum.xlsx" type="enum"/>
<importexcel name="table.xlsx" type="table"/>

externalselector

外部类的选择器,可以有多个。选择器用于指示对于某个定义了externaltype的类,选择哪个mapper。

例如你定义了Color类,你可以定义在selector为unity的情况下,将Color类映射为UnityEngine.Color类,方便使用。而服务器没有 指定selector参数,则仍然使用生成的Color类。

<externalselector name="unity"/>
<externalselector name="cocos"/>

service

service为导出目标。命令行参数中的 -s(--service)参数即指它。项目一般至少会包含client和server及all这三个导出目标。

  • name 表示service名。可以任意定义。
  • manager表示生成的包含所有表的Tables类的名称。一般取Tables。
  • group 表示导出目标中包含哪些分组。
  • server.ref 用于强行引用某些类。并非所有定义的类型都会生成代码,默认只有被导出的table直接或者间接引用的类型才会生成。如果想导出一个没被table引用,但又想为它生成代码 的类型,可以在 ref里指定强行引用。例如下面示例中 xxx.ServerOnlyType1和xx.ServerOnlyEnum1一定会导出。
<service name="server" manager="Tables" group="s">
<ref name="xxx.ServerOnlyType1"/>
<ref name="xxx.ServerOnlyEnum1"/>
</service>
<service name="client" manager="Tables" group="c"/>
<service name="all" manager="Tables" group="c,s,e"/>

xml 子定义文件

可以包含module,bean,enum,table这些定义。

典型的表定义如下:

<module name="item">
<enum name="xxx">

</enum>

<bean name="yyyy">

</bean>

<table name="Tbzzz" value="xxx" input="abc.xlsx"/>
</module>

module 定义

name属性为模块名。可以为空,也可以为多级模块名,如xx.yy。模块中可以嵌套定义子模块,子模块会继承父模块的命名空间。在模块中定义的类型,命名空间为模块全名。 如下面的Abc类,全名为 xx.yy.Abc,而Def类的命名为xx.zz.Def。

<module name="xx">
<module name="yy">
<bean name="Abc"/>
</module>
<module name="zz">
<bean name="Def"/>
</module>
</module>

refgroup 定义

定义一个ref组。有时候很多字段都会引用到共同的一组表,使用refgroup比较方便,修改时不需要改多处。

<refgroup name="xxx" ref="xx.Tbxx,yy.Tbyy,..."/>

  • refgroup.name 。必选。引用组名。需要全局唯一,不包含模块名。
  • refgroup.ref 。必选。引用的表名。格式与 ref检验器完全相同。

enum 定义

定义一个枚举。格式如下

<enum name="Color">
<var name="RED" alias="" value="1"/>
<var name="GREEN" alias="绿" value="2"/>
<var name="BLUE" alias="" value="3"/>
</enum>

<enum name="AccessMode" flags="1" tags="key1=value1#key2=value2" comment="访问方式" unique="1">
<var name="READ" value="1" tags="key1=value1#k2=v2" comment=""/>
<var name="WRITE" value="2"/>
<var name="READ_WRITE" value="READ|WRITE"/>
</enum>

语法介绍:

  • enum.name 。必选。枚举名。 命名空间为当前module的完整命名空间(包含父module)。
  • enum.flags。可选。是否为bit标志位类型。默认为false。 如果为1或true,则填写配置数据时,允许使用 READ|WRITE 这种写法
  • enum.tags。 可选。标签。格式为"key1=value2#key2=value2#..."。 一般配合自定义模板生成时才可能会用到。详细参见 定义标签 这一节。
  • enum.unique。可选。枚举值是否唯一。默认为true。
  • enum.comment。 可选。注释。 如果非空,生成代码时会包含注释。
  • enum.var.name 必选。枚举名。
  • enum.var.alias 可选。别名。 策划填写数据时,可以填别名,方便一些英语不好的策划。
  • enum.var.value 可选。枚举值。如果不填,则值为上一个枚举项的值+1。 如果是第一个枚举项,则值为0.
  • enum.var.tags 可选。标签。 一般配合自定义模板生成时才可能用上。 详细参见 定义标签 这一节。
  • enum.var.comment 可选。注释。 如果非空,生成枚举项时会包含注释。如果为空,又定义了alias,则会取alias为注释。

策划在配置表中,可以填枚举对应的 枚举项名,别名或者相应的整数值 来表达这个枚举,强烈建议不要使用整数值

bean 定义

定义一个结构类型。结构类型又分两种,普通结构和多态结构。

普通格式

必须包含至少一个字段(不允许字段数为0,避免list,bean之类的数据 无限读入的情况)。格式如下:


<bean name="Item" sep="," parent="">
<var name="item_id" type="int" ref="item.TbItem"/>
<var name="num" type="int" group="s"/>
<var name="icon" type="string" path="unity"/>
<var name="desc" type="string" tag="a=1#b=2"/>
</bean>
  • bean.name 结构名。 不能包含命名空间,例如 abc.Item是不允许的。
  • bean.parent 继承的父类名。 可选参数。默认为空。 可以继承其他模块的类型,此时parent必须写全名。
  • bean.sep 可选参数。 指定在excel数据源中,该结构以复合模式填写,例如 MyIntVector3包含x,y,z三个int字段,通过sep=",",则所有读取MyIntVector3时,都会将读入的 字符串用','拆分为三个整数,再读入。
  • var.name 字段名。 没有特别的要求,不过推荐使用xx_yy_zz这样的名称,因为生成代码时,默认会根据语言生成符合语言推荐代码风格的字段名。 有一些名字被保留不允许使用,如base,end,if之类,因为它们在一些语言里保留字或关键字,如果误用了这种名字,会有编译错误。
  • var.type 类型名。参见后面的类型定义这一节。
  • var.group 所属分组。可选。可以多个,以','分割,每个值必须是root.xml中定义的group中的一个,如不填,则该字段属于所有分组。 详细参见后面分组导出这一节。
  • var.ref 表引用。可选。指向一个表全名或者一个refgroup。会检查此字段是否为某个表的有效id。可以避免策划填错。 详细参见 processor这一节。
  • var.path 资源引用。可选。指向一个资源名。 会检查此字段是否指向有效的资源,避免策划填错而产生运行时错误。 详细参见 processor这一节。
  • var.tag 字段tag。可选。格式为 tag="tag1=xxx#tag2=bb#tag3=ccc"。用于为字段添加一些tag。主要用于自定义代码生成时对一些字段特殊处理。 详细参见定义标签这一节。

多态结构

除了像普通结构那样定义自身的子字段外,也可以在定义的最后,包含1到多个子结构。类似OOP的概念,子结构会继承父结构的所有字段。子结构既可以是普通 结构,也可以是多态结构。允许任意继承层次的多态结构定义。

<bean name="Parent" >
<var name="xxx" type="int"/>
... 更多父类的字段
<bean name="Child11">
<var name="x1" type="int"/>
... 更多 Child11 的字段

<bean name="Child21">
... 更多 Parent21 的字段
</bean>
<bean name="Child22">
... 更多 Child22 的字段
</bean>

... 更多 Parent11 的直接子类
</bean>

<bean name="Child12">
... Child12 的字段
</bean>
</bean>

在外部定义继承
<bean name="Child31" parent="Parent">
<var name="a" type="float"/>
<var name="b" type="float"/>
</bean>

<module name="inner_module">
可以从其他模块的父类继承,要求parent写全名。
<bean name="Child41" parent="test.Parent">
<var name="a" type="float"/>
</bean>
</module>

table 定义

定义一个表。 格式如下:

<table name="TbTableName" value="value_type" define_from_file="0" mode="map" input="file1,file2,..." group="group1,group2,..."/>
  • name。表名。无限制。但推荐用TbXxxx的格式。
  • value。 表记录的结构类型名。
  • define_from_file 是否从文件中读取表记录value的定义。 可选。默认为false
  • mode。 表模式。可选,默认为map。目前支持三种模式的表。
    • map。 普通key-value表;
    • list。 列表形式的表。但它支持0到多个索引,并且支持多主键联合索引及多主键独立索引。
    • singleton。 为单例表,适合用于定义一些全局信息。
  • input。表数据源。可以有多个,以','分割。每个数据源可以是文件,目录,xlsx中的某个单元薄,json中的某个字段,等等。
  • group。 表分组。 可选。值可以多个,以','分割,每个值必须为root.xml中定义的group中的一个。 如不填,则此表属于 root.xml中定义的group中default=1的分组。

table的mode详细介绍

接上面table定义中关于mode的描述。 因为较关键,独立介绍。

  • mode=map 。普通key-value表,如果未定义mode和index,则默认为普通表,并且取value_type的第一个字段为key。

定义表

<table name="TbNormalMap" value="NormalMap" index="key1" input="normal_map.xlsx"/>

示例数据表

##varkey1xynum
##typeintlongstringint
11aaa123
21bbb124
32aaa134
41aaa124
56xxx898
  • mode=singleton。 单例表,即只有一个记录的表,没有,也不能定义index属性。 为了方便起见,也可以写成mode="one"之类。

定义表

<table name="TbSingleton" value="Singleton" mode="singleton" input="singleton.xlsx"/>
##varguild_open_levelbag_init_capacitybag_max_capacitynewbie_tasks
##typeintintintlist,int
##desc1desc 2desc 3desc 4
1010050010001,10002
  • mode=list,key个数为0。 无主键列表模式。

定义表

<table name="TbNotKeyList" value="NotKeyList" mode="list" input="not_key_list.xlsx"/>

示例数据表

##varxyznum
##typeintlongstringint
11aaa123
11bbb124
12aaa134
21aaa124
56xxx898
  • mode=list, 联合多主键模式。 key个数 >= 2。 多个key构成联合唯一主键。使用"+"分割key,表示联合关系。

定义表

<table name="TbUnionMultiKey" value="UnionMultiKey" index="key1+key2+key3" input="union_multi_key.xlsx"/>

示例数据表

##varkey1key2key3num
##typeintlongstringint
11aaa123
11bbb124
12aaa134
21aaa124
56xxx898
  • mode="list", 独立多主键模式。key个数>=1, 使用","分割key,表示独立主键模式,即每个key都是独立唯一索引。

定义表

<table name="TbMultiKey" value="MultiKey" index="key1,key2,key3" input="multi_key.xlsx"/>

示例数据表

##varkey1key2key3num
##typeintlongstringint
12aaa123
24bbb124
36ccc134
48ddd124
51eee898

table.input 数据源详细介绍

table的input属性指定了数据源,允许多个,以","分割。支持非常灵活的数据源定义:

  • 来自某个excel文件的所有单元薄。例如 xxx.xlsx
  • 来自某个excel文件的指定单元薄。例如 sheet@xxx.xlsx
  • 来自json、xml、lua、yaml、unity scriptable asset文件。例如 xx.json或xx.xml或xx.lua或xx.yml
  • 来自json、xml、lua、yaml、unity scriptable asset子字段。 例如 *items@item_module.jsonitem.consts@item_module.json之类,其他格式同理
  • 来自目录。目录树下所有文件(包含递归子目录)都会被当作数据源读入,每个文件(excel族例外)对应一个记录。例如 skill_json_dir
  • 以上的随意组合。如 xx.xlsx,sheet2@yy.xls,abc@zz.json,ccc_dir

processor

对于类型,可以附加processor元数据。processor有两个用途:

  • 校验器。如 ref,path,range,set,size。
  • 特殊的注解。如sep 等等。
  • tag定义。 除了以上两种以外的名字,都会被当作tag处理。

校验器

格式为 processor1=value1#processor2=value2 ...

目前支持的检验器有ref,path,range,set,size,详细请参见文档 数据校验器

特殊注解

用于指示luban的对数据作特殊处理。目前支持有注解器有

  • sep 分割器,格式为 sep=字符列表 。只能用于加载excel数据。指示将读入的下一个单元格(或者下一个字符串),用sep中的任意一个字符分割成多个子数据,再将这些子数据作为一个当前类型的数据读入。 一般来说,只有容器类型和bean类型及text这种带有多个原子数据的类型才可能用得到sep。

定义标签

定义的所有processor=value数据对,都会被维护成 k-v tags字典。 tag目前主要用于自定义代码或者数据的模板生成,当想对某些字段作特殊处理时,tag可以发挥作用。

scriban模板文件中提供了两个函数可以操作tag。

::: v-pre

  • {{has_tag ctype 'tag_name'}} 。 检查类型是否有某个tag
  • {{get_tag ctype 'tag_name'}} 。 返回类型的tag对应的值,如不存在则返回空。 :::

数据标签

注意与定义标签不同。定义作用于结构,字段,表等等定义上,数据标签作用于记录。详细文档见 tag

目前数据标签有几个用途:

  • 记录过滤

为记录添加tag,可用于过滤导出之类的场合。比如,对于标识了dev或者debug的数据,正式发布时,可以用 --output:exclude_tags dev,test 过滤掉这些数据。

  • unchecked 标记

标识不对该记录执行校验器。研发中有时候策划批量做了一批临时数据,很多引用都不合法,程序暂时也用不到,导致生成时有大量警告,通过给数据添加unchecked的方式, 可以让检验器不检查这些记录的数据合法性。

分组导出 group

目前支持两种粒度的分组导出:table级别和bean字段级别。table定义和 bean的field定义都支持group属性。

  • table 级别导出 table的group属性如果不指定,则默认对所有group.default=1的分组导出,如果指定,则只对指定分组导出。可以有多个分组。

xml格式定义如下

<table name="TbClothDisplay" value="ClothDisplay" group="c" input="test/cloth.xlsx"/> 此表只属于c分组
<table name="TbItem" value="Item" group="c,s" input="test/item.xlsx"/> 此表属于c,s分组
<table name="TbWidget" value="Window" group="e" input="test/widget.xlsx"/> 此表只属于e分组

xlsx格式定义如下

##varfull_namevalue_typeinputgroup...
TbClothDisplayClothDisplaycloth/cloth.xlsxc
TbItemItemitem/item.xlsxc,s
TbWidgetWidgetui/widget.xlsxe

Luban.Client使用 -s client 参数时,只导出TbDemoGroup_C和TbDemoGroup_CS表,而TbDemoGroup_E表不会导出。

  • bean的field级别导出

导出配置时,bean中某个field根据分组导出。

xml定义格式如下:


<bean name="DemoGroup">
<var name="id" type="int"/>
<var name="x1" type="int"/> 默认属于所有分组c,s,e
<var name="x2" type="int" group="c"/>属于 c 分组
<var name="x3" type="int" group="s"/>属于s分组
<var name="x4" type="int" group="c,s"/>属于c,s分组
</bean>

如果在 __bean__.xlsx 中定义bean,格式如下 |##var|full_name|sep|comment| field.name |fields.type|field.group|...| |-|-|-|-|-|-|-|-| ||DemoGroup|||id|int||| |||||x1|int||| |||||x2|int|c|| |||||x3|int|s|| |||||x4|int|c,s||

如果直接在数据表里定义的bean结构,格式如下 |##var|id|x1|x2|x3|x4| |-|-|-|-|-|-| |##type|int|int|int&group=c|int&group=s|int&group=c,s| || 1|2|2|2|2|

当 -s client 时, id、x1、x2、x4字段导出。 当 -s server 时, id、x1、x3、x4字段导出。

外部类型

enum和bean类型都支持支持外部类型,可以将某个自定义类型,映射到现成的一个类。目前只支持c#语言的外部类型,其他语言需要时再扩展。

如你可以定义一个AudioType,映射到UnityEngine.AudioType。

如你可以定义一个Color类,映射到UnityEngine.Color类。

定义如下


外部枚举定义

<enum name="AudioType">
<var name="UNKNOWN" value="0"/>
<var name="ACC" value="1"/>
<var name="AIFF" value="2"/>
</enum>

<externaltype name="unity_audio_type" origin_type_name="test.AudioType">
<mapper lan="cs" selector="unity_cs">
<target_type_name>UnityEngine.AudioType</target_type_name>
</mapper>
</externaltype>

外部class定义

<bean name="Color" sep=",">
<var name="r" type="float"/>
<var name="g" type="float"/>
<var name="b" type="float"/>
<var name="a" type="float"/>
</bean>
<externaltype name="unity_color" origin_type_name="test.Color">
<mapper lan="cs" selector="unity_cs">
<target_type_name>UnityEngine.Color</target_type_name>
<create_external_object_function>ExternalTypeUtil.NewFromCfgColor</create_external_object_function>
</mapper>
</externaltype>

语法介绍:

  • externaltype.name。必选。外部类型名。这个类型名并不是真实的名字,类似id的概念。需要所有定义文件内唯一。它不会自动加上模块名。
  • externaltype.origin_type_name。 必选。被映射的类型全名
  • externaltype.mapper 映射器。 由于对于一个类,有些语言需要映射,有些语言可能不需要映射,另外,每个语言的映射参数都不一样。所以可能会有多个。
  • mapper.lan 。必选。只对该语言生效。需要与selector配合形成唯一mapper。
  • mapper.selector。 必选。 只对该selector生成。需要与lan配合形成唯一mapper。
  • mapper.target_type_name 必选。映射的外部类型全名。
  • mapper.create_external_object_function 映射外部enum时可选,外部class时必选。转换函数名。需要提供一个函数,用来将配置类对象转换到外部类对象。

使用示例,可参见示例项目 Csharp_Unity_bin_ExternalTypes

类型

luban有非常完备的类型系统,可以轻松表达任意复杂的数据结构。

原生类型

  • bool
  • byte(int8)
  • short(int16)
  • fshort
  • int(int32)
  • fint
  • long(int64)
  • flong
  • float(float32)
  • double(float64)
  • string

bytes 类型

即字节数组类型。在c#中对应byte[]

vector2,vector2,vector3

内置的向量类型。 在c#语言中对应System.Numerics.Vector{2,3,4},或 UnityEngine.Vector{2,3,4}。

  • vector2 。 float x, y;
  • vector3 。 float x, y, z;
  • vector4 。 float x, y, z, w;

datetime (time) 类型

时间类型。导出数据后,会转换为int类型1970-1-1 0:0:0 以来的UTC时间秒数。

由于策划填的都是 墙上时间(时期跟时区相关),所以导出时需要指定 datetime所对应的时区,不指定则默认使用东8区时区。 参见 Luban 命令行 中关于时区相关的参数介绍。

text

本地化文本类型。它由key和text两个值构成。

容器类型

  • array 。数组类型,定义方式为 "array,element_type"。 对应c#类型为 element_type[]之类。 例如 array,int;array,Task。
  • list。 列表类型。定义方式为 "list,element_type"。对应c#类型为List<element_type>。例如 list,int;list,Item。
  • set。 集合类型。 定义方式为 "set,element_type"。 对应c#类型为 HashSet<element_type>。例如 set,int;set,string。
  • map。 字典类型。 定义方式为 "map,key_type,value_type"。对应c#类型为 Dictionary<key_type, value_type>。例如 map,int,int;map,string,Item;

array和list的element_type可以为除了容器类型以外的任意类型,不支持容器类型的嵌套,但你可以通过定义一个bean,包含容器字段。然后再定义list,bean的方式 间接实现容器嵌套。

set的element_type必须是原生类型,datetime, 枚举类型,不能是bean类型。

map的key类型的约束与set的element_type相关, value类型约束与 array的element_type相同。

可空类型

对应c#里的可空变量的语义,如int?, bool? ColorType? 。 除了容器以外的类型都可以定义相应的可空类型。

enum 类型

枚举类型。

<enum name="Color">
<var name="RED" alias="" value="1"/>
<var name="GREEN" alias="绿" value="2"/>
<var name="BLUE" alias="" value="3"/>
</enum>

bean 类型

结构定义。bean包含两种,普通bean结构和多态bean结构。

  • 普通bean结构
<bean name="Item" value_type="1" alias="道具">
<var name="id" id="1" type="int" ref="item.TbItem" tags="k1=v1#k2=v2"/>
<var name="icon" type="string" path="unity" comment="图标" group="c"/>
<var name="num" type="int" group="c,s"/>
</bean>

  • 多态 bean 结构

<bean name="Shape">
<var name="command_var1" type="int"/>

<bean name="Shape2D">
<var name="command_2d_var" type="string"/>
<bean name="Circle">
<var name="radius" type="float"/>
</bean>
<bean name="Rectangle">
<var name="width" type="float"/>
<var name="height" type="float"/>
</bean>
</bean>

<bean name="Line">
<var name="start_pos" type="vector2"/>
<var name="direction" type="vector2"/>
</bean>
</bean>

或者在外面定义继承

<bean name="Triangle" parent="Shape">
<var name="a" type="float"/>
<var name="b" type="float"/>
<var name="c" type="float"/>
</bean>

excel 子定义文件

excel子定义文件与xml定义文件几乎完全等价,对于luban来说,只是从哪种格式的文件中解析读取定义的区别。

请参见 luban_examples/DataTables目录下的 __enums__.xlsx, __beans__.xlsx, __tables__.xlsx。

excel子定义文件与xml子定义文件几乎完全等价(除了不能定义外部类的映射信息即externaltype),对luban而言它们的区别仅仅是定义的格式不同,但提供的元数据是等价的。

::: tip 这儿仅介绍excel定义文件的格式,具体语义请参照xml子定义文件中相关文档 :::

xml子定义文件可以定义任意结构,但excel不适合在一个文件里定义各种不同结构,因此excel子定义文件分类型,每个类型只定义一种结构。每个类型可以有0到多个定义文件(多个importexcel语句,而不是name里包含多个文件)。

由于大多数使用excel文件来定义配置的使用者,为了方便起见,希望定义excel文件在配置数据目录下,而不是跟其他定义一样,在配置定义目录下,特地作了特殊处理,以%input_data_dir%为相对目录读入excel定义文件。

有三种类型的定义文件:

  • enum
  • bean
  • table

<importexcel name="__enums__.xlsx" type="enum"/>
<importexcel name="__beans__.xlsx" type="bean"/>
<importexcel name="__tables__.xlsx" type="table"/>

enum 定义文件

定义多个enum结构。

格式如下

##varfull_nameflagsuniquecommenttags*items
##+namealiasvaluecommenttags
test.ETestQualityfalsetrueA1最差品质
B1最差品质
C1中等品质
D1最好品质
test.AccessFlagtruetrueWRITE1
READ2
TRUNCATE4
NEW8
READ_WRITEREAD|WRITE

bean 定义文件

定义多个bean结构。 不支持多态bean定义。

格式如下

##varfull_namesepcommenttags*fields
##+nametypegroupcommenttags
test.DemoBean1x1int
x2string
x3float
x4bool
test.DemoBean2x1int
x3list,float
x4test.DemoBean1

table 定义文件

定义配置表列表,只有出现在此表中的表才会导出。

value_type为表记录类型类,必须是bean结构。value_type的类型名中如果不包含模块名,则取与full_name相同的命名空间,如果包含模块名,则取此模块名。例如,Item的模块名为 item,demo.Bag的模块名为demo。

格式如下

##varfull_namevalue_typedefine_from_fileinputindexmodegroupcommenttagspatch_inputoutput
item.TbItemItemtrueitem.xlsx
test.TbBagdemo.Bagtruebag.xlsx