跳转到内容

输出格式

每个命令都支持 -o / --output 来控制输出格式。该标志在全局注册,因此读取、写入、删除以及其他所有子命令都会一致地遵循它。根据实际用途选择合适的格式:阅读、脚本编写或数据导出。

默认格式,针对人类阅读优化。

Terminal window
redmine issues list --project myproject
ID TRACKER STATUS PRIORITY SUBJECT
123 Bug Open High Fix login timeout
124 Feature Open Normal Add dark mode
兼容 jq

JSON 输出可与 jq 配合用于即席分析:

Terminal window
# IDs of all open bugs
redmine issues list --tracker Bug -o json | jq '.[].id'
# Count issues by status
redmine issues list --project myproject -o json \
| jq 'group_by(.status.name) | map({status: .[0].status.name, count: length})'

-o json 会在 stdout 上产生两种顶层结构:

  1. 原始资源:用于获取或返回数据的命令 (例如 issues listissues getproject create 等)。输出内容就是 API 返回的资源对象,或者资源对象数组。

  2. 动作信封:用于那些没有自然响应体的变更类命令 (例如 issues closeissues deleteissues assignwiki deletememberships delete 等)。该信封结构稳定且精简:

    {
    "ok": true,
    "action": "deleted",
    "resource": "project",
    "id": "demo",
    "message": "Project \"demo\" deleted"
    }

    ok 表示该命令是否实际改变了状态。某些命令即使成功执行,但没有内容需要变更,也可能返回相同结构且 ok: false,并附带说明性的 message

    action 的取值集合很小且刻意保持稳定:createdupdateddeletedclosedreopenedassignedcommentedloggeduser_addeduser_removedlogged_inlogged_outswitchedinstalledopened

启用 -o json 后,如果命令执行失败,CLI 会将结构化错误信封写到 stdout,并以非零状态码退出:

{
"error": {
"message": "Resource not found.",
"code": "not_found"
}
}

code 来自一组稳定且有限的值:not_foundauth_failedforbiddenvalidation_failedserver_errorunknown。校验错误还会包含 details 数组,其中列出 Redmine 返回的各项字段错误信息。

  • 机器可读输出(JSON、CSV、表格行)始终写入 stdout
  • 面向人的信息(非 JSON 模式下的成功确认、警告、进度 spinner、更新检查提示)始终写入 stderr

这种分离是稳定的。脚本可以安全地把 stdout 重定向到文件,或者直接通过管道传给 jq,而不必担心状态提示混入输出。

在配置文件中设置默认格式:

~/.redmine-cli.yaml
output_format: table

-o 标志始终会覆盖单次命令的默认格式。