迁移包
为 lip v0.37.0 及更早版本编写的包使用格式版本 1、2 或 3 的 tooth.json。现在的包改用 lip.toml(参见 lip.toml)。lip 仍可安装带有这类 tooth.json 的包,但你的包的新版本应使用 lip.toml。lip pkg migrate 命令可帮助你完成转换。
使用 lip pkg migrate
在包仓库的根目录(即包含 tooth.json 的目录)中不带参数运行 lip pkg migrate:
cd MyTool
lip pkg migrate
git add lip.toml tooth.json
git commit -m "Migrate tooth.json to lip.toml"它写入由 tooth.json 转换而来的 lip.toml,然后删除 tooth.json。lip.toml 已存在,或 tooth.json 不存在或不是 lip 能读取的格式 1、2 或 3 的 tooth.json 时,命令会失败,且不做任何修改。
询问
lip.toml 没有 RID 模式:每个条目只指定一个平台,即一个 RID。当结果需要某个旧文件未提供的值时,lip 会在终端上询问,直到回答有效为止:
tooth.json中win-*这样的platform模式所代表的平台(RID),以逗号分隔(每个都必须匹配该模式);tooth.json中windows/amd64这样不是 RID 的platform所代表的平台(RID),以逗号分隔;- 没有
platform的变体所适用的平台(RID)(存在这类变体时)。
若标准输入或标准错误不是终端(例如在 CI 中),lip pkg migrate 会失败,指明本应询问的值,且不做任何修改。
警告
所有被丢弃或以不同含义转换的内容都会以警告形式输出,并指明其来源字段,例如 variants (label '', win-x64).assets[1]。tooth.json 格式 1 和 2 的文件会先被转换为格式 3,因此字段名按格式 3 给出。警告不会导致命令失败;请检查这些警告,按需修改 lip.toml,然后提交。
变化内容
format 为 4,tooth 变为 id,version 和 info 原样复制,但 info.avatar_url 以 https:// 开头时变为 info.logo,否则被丢弃并给出警告。变体按以下方式改写:
- 每个标签变为同名变体;空标签变为变体
""。 - 对标签适用的每个平台(其各变体的
platform,模式和不是 RID 的值展开为你给出的 RID),该标签下适用于该平台的变体按 lip v0.37.0 的方式合并,结果变为该platform的一个条目。合并后的变体依赖github.com/LiteLDev/LeviLamina#client时,其side为client;依赖github.com/LiteLDev/LeviLamina的其他变体时,为server;不依赖 LeviLamina 时,结果变为两个条目,每个运行端各一个。 dependencies连同其范围变为deps。现在无效的范围会在终端上询问,直到回答是有效范围;没有终端时命令失败且不做任何更改。- 每个资源保留其
type和urls,其placements变为place,转换方式与 lip 读取早期格式的tooth.json完全相同:\替换为/、空段和.段被移除后,dir放置规则采用目录形式(src和dest以/结尾,或为""),src含*、?或[的file放置规则采用 glob 形式(dest以/结尾,或为""),其他file放置规则采用文件形式。在lip.toml中无效的放置规则会被省略,并给出警告。 lip.toml没有tar、tgz和uncompressed资源类型。合并后的变体含有这类资源的平台不会得到条目,并给出警告,这与 lip 在该平台下不安装其任何条目一致。preserve_files变为preserve,remove_files变为purge,其中的\替换为/;不含/的preserve_files模式加上前缀**/,不以/结尾的remove_files模式还会以带结尾/的形式再写一遍(参见局限)。- scripts 变为
hooks:pre_install、post_install(先install,再post_install)、pre_uninstall(先pre_uninstall,再uninstall)和post_uninstall。 info之外的其他空值会被省略。
局限
lip pkg migrate 只是辅助工具,不保证结果正确。请始终检查其输出。
lip.toml要求标签处的version等于标签版本,且仓库的id等于其路径。lip v0.37.0 会安装违反这些规则的tooth.json;发布前请检查你的文件。- 放置规则按上述规则转换,不查看它们放置的文件,随后按
lip.toml的方式执行:src为模式的file放置规则会保留其匹配文件的子目录,而tooth.json过去只按文件名放置它们;放置缺失文件的放置规则会使安装失败,而tooth.json过去会跳过它。请检查这类放置规则。 - 不含
/的preserve_files模式过去会匹配任意目录中的文件名;它会变为**/<pattern>。remove_files模式过去也会删除匹配的目录;它还会以带结尾/的形式再写一遍。不是有效 glob 的模式(例如以/开头的)会被丢弃。 - 格式 1 和 2 中版本范围无法在格式 3 中读取的依赖(例如
2.16.x)在安装tooth.json时本就会被忽略;lip 会报告它们,以便你手动添加。 - 安装与卸载钩子以外的脚本(例如
pre_pack或自定义脚本)以及格式 2 的prerequisites没有对应项,会被丢弃。 - 迁移得到的包是一个文件包,把文件放到与旧
tooth.json相同的位置。如果你的包是 LeviLamina mod,可以考虑改为以mcmod资源发布(参见 mod),它会被安装到mods/<name>/。 - 对其他仍带有
tooth.json的包的依赖仍然有效,因为 lip 仍可安装它们。
只有名称恰为 v<SemVer> 的标签(例如 v1.2.3)才是版本。v1.2 这样的标签不是版本。