跳到主要内容
版本:Next

字段变体(Variants)

有时候同一个字段可能有多个配置。一个非常常见的场景是制作本地化数据时,不同地区的某个初始道具有不同的值。

一个粗糙的做法类似这样:

##variditem_iditem_id_zhitem_id_en
##typeintintintint
1100120013001
2100220023002

虽然这样确实可以工作,但有几个问题:

  • 对于某个地区(如zh)来说,它并不需要其他地区的item_id,这个会增大了配置数据,也增加了无谓的内存开销
  • 程序员需要根据当前地区,选择从 item_id_zh 还是 item_id_en读取数据,这带来不便

字段变体较好地解决了此问题。无论是哪个地区的item_id_{xxx},最终都会导出为一个公共的item_id字段,并且不包含其他用不到item_id_{yyy}。

定义

当前只有字段支持变体,所有可以定义字段的地方都可以定义变体信息。

xml定义

    <bean name="TestVariant">
<var name="id" type="int"/>
<var name="value" type="int" variants="zh,en,fr,jp"/>
</bean>

__beans__.xlsx中定义

variant_beans

在数据表的标题行定义

对于需要定义变体的字段,为每个变体定义一个{fieldName}@{variant}的变量。有几个规则:

  • 变体标题头所在的列必须在变量名列之后,即 value@en必须在value列之后
  • 不需要为变体变量定义typegroup之类信息,变体变量直接使用原始变量相应的值,即value@entype会取valuetype

variant_table_header

配置变体数据

excel格式族

variant_table_header

json格式

{
"id":1,
"value@en": 1001
}

xml格式

<data>
<id>1</id>
<value variant="en">1001</value>
</data>

yaml格式

id: 1
value@en: 1001

lua格式

return {
id=1,
["value@en"] = 1001,
}

导出数据

一般来说,既然定义了变量变体,导出数据时应该为该变量指定当前应该使用的变体。命令参数--variant {variantKey}={variantName}用于为字段指定当前使用的变体。 {variantKey}{beanFullName}.{fieldName}, {variantName}为变体名。 例如--variant TestVariant.value=en表示导出数据时value字段取value@en列对应的值。

在为某个变量指定了当前使用的变体后,如果对应的字段不存在,则取默认字段的值。同样地,以变体en为例,如果value@en列不存在,则取value列的值,如果value列也不存在,则抛出字段找不到的错误。

可以使用--variant default={variantName}设置全局默认变体,当未没有为某个bean单独设置变体时,则取全局默认变体。

如果某个字段定义了变体,但没有在命令行中使用--variant指定该字段使用的变体名,则读取不含变量的原始变量的值。此时Luban会打印一行警告日志。