Skip to content

Repository files navigation

xresconv-cli

xresconv-cli:表格批量转换与命令行调度

这是一个符合 xresconv-conf 规范的 CLI 转表工具,使用 xresloader 作为数据导出后端。

自 2.0.0 起使用 Rust 实现,提供各平台预编译二进制,不再依赖 Python 运行时。(Python 入口保留为兼容转发层,见下文。)

安装

从 GitHub Releases 下载对应平台的预编译包,并用同名 .sha256 文件核对校验和:

平台 制品
Linux x64 xresconv-cli-<version>-x86_64-unknown-linux-gnu.tar.gz(或 -musl 静态链接版)
Linux arm64 xresconv-cli-<version>-aarch64-unknown-linux-gnu.tar.gz(或 -musl 静态链接版)
macOS arm64 (Apple Silicon) xresconv-cli-<version>-aarch64-apple-darwin.tar.gz
macOS x64 (Intel) xresconv-cli-<version>-x86_64-apple-darwin.tar.gz
Windows x64 xresconv-cli-<version>-x86_64-pc-windows-msvc.zip
Windows arm64 xresconv-cli-<version>-aarch64-pc-windows-msvc.zip

以下扩展平台在发布流水线中尽力构建(失败不阻塞发布,不保证每个版本都有产物): Linux RISC-V 64、Android arm64、FreeBSD x64。 Windows/Linux i686、Linux ARM32 和 LoongArch 不提供预编译包;旧 Python 入口仍可通过 XRESCONV_CLI_BIN 转交用户自行提供的可执行文件。 这些平台仍需能够运行兼容的 Java/xresloader;不提供无独立 CLI/JVM 运行环境的 iOS 包。

解压后将 xresconv-cli(Windows 为 xresconv-cli.exe)放入 PATH 即可。 运行转表需要 java 可执行程序(在 PATH 中,或配置 JAVA_HOME,或用 -J 指定)。 本工具不校验也不绑定 JDK 版本;实际支持的 JDK 范围由后端 xresloader 决定。

也可以从源码构建(Cargo.toml 声明最低 Rust 版本为 1.88):

源码中的图标、截图和二进制资源使用 Git LFS;安装 Git LFS 后,在克隆的仓库中执行:

git lfs install --local
git lfs pull
cargo build --release --locked
# 二进制位于 target/release/xresconv-cli

Windows 构建会将应用图标和版本信息嵌入 .exe,需要 Windows SDK 资源编译器;Linux/macOS 保持命令行程序形态。

使用说明

xresconv-cli [CLI 选项]... <转换列表文件> [-- [附加 xresloader 选项]...]
选项 作用
-h, --help 显示帮助,不需要转换列表
-v, --version 显示版本号并退出,不需要转换列表
-s, --scheme-name <scheme> 筛选 <item scheme="...">;可重复传入,保留任一名称匹配的项目
-t, --test 预览转换命令,不启动 Java,不生成导出文件
-p, --parallelism <number> 正整数并发上限;默认根据 CPU 数量取 1 或 2,实际性能需用自己的数据测量
-j, --java-option <option> 追加 JVM 参数,可重复传入;例如 -j Xmx2048m,CLI 自动补前导 -
-J, --java-path <path> 指定 Java 可执行文件或 PATH 中的命令名,优先于 JAVA_HOME 和默认 java
-a, --data-version <version> 覆盖 XML 的 data_version;值还须满足下文的 stdin 参数限制

配置示例见 convert.xml。把它复制为项目的 convert.xml,准备后端 JAR、 kind.pb 协议描述和含 scheme_kind / scheme_upgrade 的 tables.xlsx,再根据实际文件修改配置。 此示例为两张表分别规划 bin 和 JSON 输出;协议及表格内容由自己的 xresloader 项目提供。

路径按以下规则解析:work_dir 相对于主转换列表所在目录;xresloader_path 及传给后端的协议、数据和输出路径 相对于该工作目录;include 相对于包含它的 XML 文件。CLI 忽略 GUI 专用的分组、分类和脚本配置。

xresconv-cli --version
xresconv-cli --test -p 1 convert.xml
xresconv-cli -s scheme_upgrade -a release-demo -j Xmx512m convert.xml -- --pretty 2

--test 仍会检查 XML、工作目录和 JAR 文件是否存在,但不验证 JAR、协议或表格能否实际转换。 预览显示 0 job(s) failed 只表示规划成功;实际转表请去掉 --test。 附加后端选项放在 -- 后,避免与 CLI 自身的 -p、-s 等选项混淆。 JVM 参数在 CLI 中省略前导 -,XML 的 <java_option> 则保留完整参数(例如 -Xmx512m)。

Python 兼容入口

xresconv_cli.py / __main__.py / xresconv-cli.py 保留为兼容转发层:打印升级提示后把全部参数转发给 Rust 可执行文件,并透传退出码,旧流程(如 python xresconv_cli.py ...)可继续运行。二进制按以下顺序解析:

  1. 环境变量 XRESCONV_CLI_BIN 指定的可执行文件路径;不存在时提示并继续尝试缓存/下载。
  2. 缓存目录中已下载的二进制(Windows 为 %LOCALAPPDATA%\xresconv-cli\bin,其他平台为 ${XDG_CACHE_HOME:-~/.cache}/xresconv-cli/bin)。
  3. 以上都缺失时,从 GitHub Releases 下载最新版本的对应平台制品(校验 sha256 后写入缓存)。

Linux x64/arm64 优先使用 musl 静态包,以兼容不同 libc 发行版。下载具有超时与大小限制,校验失败不会覆盖现有缓存; 安装使用同目录临时文件与原子替换,并发启动不会读到下载了一半的二进制。已缓存版本不会每次联网检查升级。 Python 3.14 已实测;兼容层保留旧入口的调用方式。自动测试使用 Python 3 和本地编译的 Rust 二进制。

与 Python 版的行为差异

  • -v/--version 现在可以独立调用(原实现因 argparse 位置参数必填而无法单独使用)。
  • 不带参数时打印帮助并以退出码 -1 退出(Unix 上表现为 255);历史 argparse 实际会在必填参数检查时以 2 退出。
  • 支持 <output_type output_dir="..."> 属性(原实现解析了 rename/tag/class 但遗漏了 output_dir)。
  • java 子进程启动失败会明确报错并计入失败数(原实现线程崩溃但失败数不增加)。
  • 日志着色兼容 TERM=dumb(原实现判断的是 dump)。
  • 颜色模式仍由 CPRINTF_MODE 环境变量控制(term/none/win32_console;win32_console 映射为 ANSI 虚拟终端)。
  • 拒绝非正数并发;空计划不启动 Java;失败累计不会因 Unix 退出码截断而变成成功。
  • 保留 include/全局/局部选项的覆盖顺序、scheme 重复值原文、空 file/scheme 的内联规则及输出矩阵筛选。 循环 include 和超过 128 层的 include 会明确报错,不再递归至崩溃。
  • -J 显式指定无效路径时直接报错;相对 Java 路径在切换后端工作目录前解析。 Ctrl+C/终止信号会停止并回收本次后端进程树,以 130 退出。
  • CLI 尾部参数保留空格边界;stdin 参数按已核验的 xresloader 2.23.7 分词协议选择单双引号。 后端无法表示的组合(例如同时包含两种引号与空格,或换行/NUL)会报错。详细合同见 迁移合同。

开发与测试

cargo fmt --all --check
cargo check --workspace --locked
cargo test --workspace --locked
cargo clippy --workspace --all-targets --locked -- -D warnings

完整本地测试需要 Python 3 和 PowerShell 7(兼容入口/发布脚本测试),正式二进制不需要它们。 测试包含 官方 sample 契约、测试专用 fake-java、进程取消/大量输出/并发、离线下载与缓存、制品校验。 这些 fixture 保留固定上游版本的路径和内容,用于合同测试;直接运行请使用上面的配置示例。 Python 入口通过 XRESCONV_CLI_BIN 指向本地 Cargo 二进制;不会下载发布版本。 fake-java 在测试独立目录内从当前源码构建,过滤测试和覆盖率运行不会复用陈旧替身。 覆盖率与测试证据见 验证记录,不将单个平台的覆盖率视为所有平台分支的完整证明。

CI 只测试本仓库的 Rust/Python 入口、仓内 fixture 和 fake-java,不下载其他仓库的 Release/JAR/sample。 Python 使用最新稳定的 3.x(Python 没有单独的 LTS 发行系列)。 常规 runner 使用 *-latest;Linux/Windows ARM 原生 runner 使用 GitHub 提供的专用标签, macOS x64 包在 macos-latest 上构建和冒烟。

发布流程

推送与 Cargo.toml 版本一致的 tag(当前如 v2.0.2 或 2.0.2)会触发 release.yml。 流程复用完整构建/测试门禁,检查全部 8 个核心制品及 SHA256,上传完毕后自动公开 Release。 预发布版本标记 prerelease,不替换 latest;上传失败保留草稿,已公开版本拒绝覆盖。 常规 push/PR 同样构建并保存跨平台包为 Actions artifacts,扩展平台失败不阻塞核心发布。 本地可用 pwsh -NoProfile -File scripts/release.ps1 -Mode Tag -Tag v2.0.2 检查 tag。

示例截图

应用图标、多尺寸 PNG、Windows ICO 和项目横幅见 静态资源说明,包含设计、导出与 LFS 维护方法。

以下为 Rust CLI 的实际终端输出快照,使用 示例配置 和 --test。 截图生成方法与预览边界见 资源说明。

显示版本,并预览全部表的两种输出:

Rust CLI 版本和全部转换命令预览

只预览 scheme_upgrade,覆盖数据版本、追加 JVM 参数并转发 --pretty 2:

按 scheme 筛选并追加参数的命令预览

Releases

Packages

Used by

Contributors

Languages