sow config

只读校验 sow.yml,并打印任意作用域的有效配置。

sow config 有两个只读子命令。config check 是对 sow.yml 的全量预检——每次手工改完配置以及在 CI 里都该跑一遍。config show 打印 SOW 实际算出来的配置,用它确认默认值、继承的架构与规范化别名 是不是按你预期解析的。

两个子命令都不创建目录、不碰数据库、不自动修正你的文件。

语法

sow config check [-C DIR] [--json]
sow config show [--all] [-C DIR] [-r NAME] [-d NAME]... [--json]

sow help config 会列出两者。

sow config check

解析并校验完整的 sow.yml:schema 版本、名称、路径冲突、架构许可表、Dist 格式、成员策略与签名 key 引用。它会回报解析到的工作区以及校验了多少对象。

sow config check
configuration valid: /srv/repo repositories=1 dists=2
sow config check --json
{"schema":"sow.cli/v1","command":"config check","ok":true,"repository":null,"operation":null,"result":{"workspace":"/srv/repo","repositories":1,"dists":2},"errors":[]}

参数

参数说明默认
-C, --workdir DIR工作区发现的起始目录当前目录
--json输出版本化 JSON envelopefalse
-h, --help显示帮助

严格拒绝未知字段

未知键是错误,不是警告。一个拼写错误不会静默地让某条策略失效:

sow config check
configuration error: load config "/srv/repo/sow.yml": parse sow.yml: yaml: unmarshal errors:
  line 8: field bogus_field not found in type config.DistConfig

schema 版本被钉死:

sow config check
configuration error: load config "/srv/repo/sow.yml": config schema must be "sow/v2", got "sow/v1"

check 还会验证声明的每个签名 key 引用可解析且适用于签名——过程中绝不打印密钥材料。如果你从许可表 里删掉一个架构,而仍有 Dist 配置、Membership 或已构建代在用它,config check 会拒绝该配置。

sow config show

以 YAML 打印当前选定作用域的有效配置。

sow config show
schema: sow/v2
architectures:
  - x86_64
  - aarch64
repos:
  pigsty:
    protected: false
    signing:
      rpm:
        packages:
          mode: never
    dists:
      el9:
        format: rpm
        architectures:
          - x86_64
          - aarch64
        limit: 0
        exclude: []
      trixie:
        format: deb
        architectures:
          - x86_64
          - aarch64
        limit: 0
        exclude: []

对比磁盘上的文件——里面只有你写的内容:

cat sow.yml
schema: sow/v2
architectures:
  - x86_64
  - aarch64
repos:
  pigsty:
    signing:
      rpm:
        packages:
          mode: never
    dists:
      el9:
        format: rpm
      trixie:
        format: deb

show 补上了 protected: false、每个 Dist 继承来的 architectureslimit: 0 与空的 exclude 列表。架构一律以规范化 family(x86_64aarch64)打印,绝不用生态别名——amd64arm64 只是 同两个 family 的 DEB 写法。

参数

参数说明默认
--all展开整个工作区的默认值与规范化架构关闭
-C, --workdir DIR工作区发现的起始目录当前目录
-r, --repo NAME选择一个仓库按选择规则
-d, --dist NAME选择一个 Dist;可重复按选择规则
--json输出版本化 JSON envelopefalse
-h, --help显示帮助

用 -r/-d 做作用域投影

-r-d 把输出收窄到选中的对象。要回答"这一个 Dist 上实际生效的策略是什么",这是最快的方式:

sow config show -r pigsty -d el9
schema: sow/v2
architectures:
  - x86_64
  - aarch64
repos:
  pigsty:
    protected: false
    signing:
      rpm:
        packages:
          mode: never
    dists:
      el9:
        format: rpm
        architectures:
          - x86_64
          - aarch64
        limit: 0
        exclude: []

--all 方向相反:无论你站在哪里,它都展开整个工作区。

秘密永不输出

密钥材料与 passphrase 不会出现在 config show、JSON、操作日志或错误文本中。只显示引用形态 (file://…env://…agent://…)与 fingerprint。

示例

在 CI 里先校验再构建:

sow config check -C /srv/repo || exit 1
sow build -r pgsql

比较两个 Dist 的有效策略:

sow config show -r pgsql -d el9 > /tmp/el9.yml
sow config show -r pgsql -d el9-beta > /tmp/beta.yml
diff -u /tmp/el9.yml /tmp/beta.yml

退出码

触发条件
0配置合法,或输出成功打印
1读取配置文件时的运行时 I/O 错误
2用法错误、工作区未找到、未知字段、schema 不符,或任何校验失败
6指定的仓库或 Dist 不存在

config check 把校验失败报为退出码 2 而不是 6:非法的 sow.yml 属于配置错误,不是被拒绝的 操作。

参见

最后修改:2026-08-08: init commit (fe725aa)