tooth.json
tooth.json
文件定义了包的元数据、标识符、版本、依赖项、文件和其他配置设置。此文件必须以JSON格式存在,并位于包的根目录中。
有关完整的JSON模式规范,请参见tooth.v3.schema.json。
在下面的文档中,字段被标记为(必需)或(可选)。请注意,如果父字段是可选的但包含必需的子字段,则只有当父字段被包含时,这些子字段才成为强制性的。例如,虽然variants
是可选的,但如果你包含它,每个变体都必须指定一个platform
。
Scriban表达式允许你在任何字符串值中动态引用其他字段,使包维护更容易。例如,使用{{tooth}}
引用包的tooth路径或{{version}}
访问包的版本号。这种动态引用有助于保持你的包配置DRY(不要重复自己)并更易于维护。然而,一些包清单操作命令(例如带有--save
选项的命令)可能不支持Scriban表达式。
字段
format_version (必需)
格式版本号。目前仅支持版本3
。
format_uuid (必需)
格式的唯一标识符。目前仅支持289f771f-2c9a-4d73-9f3f-8492495a924d
。
tooth (必需)
包的tooth路径,Go模块路径格式中的唯一标识符(不带协议头和后缀的URL)。
示例:
github.com/LiteLDev/LeviLamina
提示:要发布一个包,它的tooth路径必须与它所在仓库的URL匹配。
version (必需)
The package version in semantic versioning format. 该字段需要遵循语义化版本格式。
示例:
1.0.0
1.0.0-alpha.1
0.1.0
当创建Git标签时,版本号前需要加上v
(例如v1.0.0
)。然而,在version
字段中需要省略v
前缀。
不要使用v0.0.0
,因为Go模块代理将其视为伪版本。
info (可选)
包的元数据字段。
info.name (可选)
包的显示名称。
info.description (可选)
包的简要描述。
info.tags (可选)
包标签采用以下格式之一:
- 简单格式:
tag
- 键值对格式:
tag:subtag
标签和子标签只能包含小写字母、数字和连字符([a-z0-9-])。虽然lip平等对待这两种格式,但一些平台如Bedrinth可能使用它们的方式不同。
info.avatar_url (可选)
包的头像/图标的URL。
variants (可选)
由数组组成的平台特定包配置。这是tooth.json
的核心配置部分。
lip按顺序处理变体,应用与当前平台匹配的所有变体。当多个变体匹配时,它们的配置将被合并。
注意:对于平台兼容性检查,lip会忽略使用glob模式的变体。要支持多个平台,即使它们为空,也必须为每个平台定义单独的变体。
variants[].label (可选)
此变体的标签。用户可以使用lip install <tooth>#<标签>@<版本>
通过标签安装特定变体。应与^[a-z0-9]+(_[a-z0-9]+)*$
匹配或是一个glob模式。如果省略或为空,则该变体被视为默认值。
为了使变体标签被识别,在变体数组中必须至少有一个带有非glob标签的变体。标签字段中的glob模式只有在它们对应的非glob标签也被定义时才会生效。例如:
- 只有
label_*
并不表示支持任何标签 - 要支持
label_a
和label_b
,你需要: - 两个带有确切标签的独立变体
- 一个带有确切标签的变体和另一个带有
label_*
的变体
variants[].platform (可选)
此变体的目标平台。有效值:
linux-arm64
linux-x64
osx-arm64
osx-x64
win-arm64
win-x64
- Glob 语法 (e.g.,
linux-*
)
为了使平台变体被识别,在变体数组中必须至少有一个非glob平台变体。平台字段中的glob模式只有在它们对应的非glob平台也被定义时才会生效。例如:
- 只有
linux-*
并不表示支持任何Linux平台 - 要支持
linux-x64
和linux-arm64
,你需要: - 两个带有确切平台的独立变体
- 一个带有确切平台的变体和另一个带有
linux-*
的变体
如果省略或为空,则该变体被视为平台无关,即始终为当前平台。
variants[].dependencies (可选)
软件包的依赖,指定为键值对。键是包标识符(可选带有子目录路径),值是版本约束。
示例:
键:
github.com/futrime/example-package
github.com/futrime/example-package#subpath
版本约束:
- 确切版本:
1.0.0
- 范围:
>=0.1.0 <1.0.0
版本解析使用WalkerCodeRanger/semver。
variants[].assets (可选)
定义应如何处理软件包中的文件。
variants[].assets[].type (必需)
资产类型:
self
: 文件从包本身获取tar
: TAR 归档包tgz
: Gzip格式压缩的 TAR 归档包uncompressed
: 单个未压缩的文件zip
: ZIP 压缩包
variants[].assets[].urls (可选)
该资产的下载URL,按顺序尝试。对于self
类型的资产,该数组需要为空。(是的这是个数组)
variants[].assets[].placements (可选)
在工作区中放置文件的规则。接受一个放置规则数组。
variants[].assets[].placements[].type (必需)
放置类型:
file
: 放置单个文件dir
: 放置目录
提示: uncompressed
资产仅支持 file
类型放置.
variants[].assets[].placements[].src (必需)
源路径规范:
- 对于
uncompressed
资产: 值为空 (""
) - 对于
file
类型: 文件路径或者glob表达式 (如果匹配到目录将会被被忽略,文件将会被展平) - 对于
dir
类型: 目录路径(会保留结构)
variants[].assets[].placements[].dest (必需)
目标路径:
- 对于文件放置: 目标是文件的路径
- 对于目录/glob放置: 目标是文件夹的路径
variants[].preserve_files (可选)
在卸载过程中保留的文件路径或glob模式数组。
variants[].remove_files (可选)
在卸载过程中要删除的文件路径或glob模式数组。这将覆盖preserve_files
设置。
variants[].scripts (可选)
在工作区中要执行的命令。定义为一个键值对,其中键是脚本名称,值是要按顺序执行的命令数组。如果多个匹配的变体定义了相同的脚本,即使脚本未定义,也只会使用最后一个定义的脚本,即建议尽可能晚地定义脚本。
内置脚本钩子(所有值都是字符串数组):
pre_install
: 安装前install
: 文件放置后post_install
: 安装后pre_pack
: 包装前(仅适用于默认变体)post_pack
: 包装后(仅适用于默认变体)pre_uninstall
: 卸载前uninstall
: 文件删除后post_uninstall
: 卸载后
可以使用lip run <script>
运行自定义脚本。自定义脚本名称应匹配^[a-z0-9]+(_[a-z0-9]+)*$
,并且也期望值是命令数组(pre_install
之类的)。