Skip to content

[Feature Request] 为 dry-run 模式增加 --json 参数,输出结构化数据 #360

@flw-cn

Description

@flw-cn

背景与动机

chsrc-dry 模式非常实用,可以模拟换源过程并打印将要执行的命令。但目前输出内容为纯文本,其中混有提示信息、换源命令、额外说明等,不利于自动化工具(如 Dockerfile 生成、CI 脚本、配置管理工具)直接解析。

例如,执行 chsrc set -dry alpine 会输出:

chsrc: 开启Dry Run模式,模拟换源过程(跳过测速),命令仅打印并不运行

选中镜像站: TUNA (tuna)
--------------------------------
[chsrc 运行] sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories
[chsrc 运行] apk update
--------------------------------
感谢镜像提供方: 清华大学开源软件镜像站
...

对于自动化场景,我希望能够直接获得一个 干净的、可编程处理的命令列表,而不必用正则表达式去猜测哪些行是真正的命令。

期望功能

chsrc set 命令增加一个 --json 参数,当与 -dry 一起使用时,只输出一个 JSON 对象(不输出其它任何人类可读的提示信息),其中包含:

  • 本次操作的基本信息(目标、选择的镜像源等)
  • 需要执行的命令数组(每条命令可附带描述)

使用示例

chsrc set -dry alpine --json

期望输出(缩进仅用于阅读,实际可压缩为一行):

{
  "version": "1.0",
  "dry_run": true,
  "target": "alpine",
  "selected_mirror": {
    "name": "TUNA",
    "url": "https://mirrors.tuna.tsinghua.edu.cn/alpine"
  },
  "commands": [
    {
      "command": "sed -i 's#https\\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories",
      "description": "替换 Alpine apk 软件源为 TUNA 镜像站"
    },
    {
      "command": "apk update",
      "description": "更新软件包索引"
    }
  ]
}

应用场景

  1. 生成 Dockerfile
    直接解析 commands 数组,将其转换为 RUN 指令,无需手工提取命令。

  2. 配置管理(Ansible / Puppet 等)
    将换源操作作为幂等任务集成到自动化工具中。

  3. 构建自定义镜像脚本
    在脚本中动态获取换源命令,应对不同发行版或软件源。

实现建议(供开发者参考)

  • 仅在同时指定 -dry--json 时启用 JSON 输出模式。
  • 关闭所有人类可读的输出(包括 chsrc: 开头的提示、分隔线、感谢信息等),只打印一个 JSON 对象。
  • 可以考虑将 commands 数组中的 command 字段保持为 原始字符串(不转义额外的 shell 元字符),以便直接复制或执行。
  • 若未来支持多个镜像站备选或测速结果,可预留 mirrors_candidate 字段。

附加说明

  • 如果该项目已有类似的输出控制参数(如 --quiet--plain),我愿意与之保持一致。
  • 如果需要我帮助测试或提供更多样本输出,请告知。

感谢维护者的辛勤工作!chsrc 是一个非常实用的工具,如果能增加 --json 支持,将极大扩展它在自动化生态中的价值。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels
    No fields configured for Request.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions