Semifold
配置

配置参考

逐项说明当前 .changes/config.toml 配置结构中的字段、默认值和职责。

Semifold 读取 .changes/config.toml 中的 TOML 配置。字段名使用 kebab-case。JSON 配置和未知字段不属于受支持的配置契约。

[branches]

字段类型必需含义
base字符串日常开发与发布准备开始的基础分支。
release严格 MiniJinja 模板字符串用来维护版本修改和发布拉取请求的分支。

不含模板语法的值会保持为固定分支名。需要按当前版本决定生成分支时,可以使用 release.plan.fingerprintrelease.plan.common_version,或通过稳定 PackageId 读取 release.plan.packages["<PackageId>"].next_version

[branches]
base = "main"
release = 'release/v{{ release.plan.packages["semifold"].next_version }}'

模板使用严格变量检查。引用的软件包不在本次发布集合,或计划中的软件包没有共同版本时,渲染会失败而不是生成含糊的分支名。

[release]

可选的严格 MiniJinja 模板可以定制发布分支上的提交消息及其 Pull Request 标题:

[release]
commit-message = "chore(release): {{ release.plan.fingerprint }}"
pull-request-title = 'chore(release): {{ release.plan.packages["semifold"].next_version }}'
字段类型默认值含义
commit-message严格 MiniJinja 模板字符串chore(release): bump versions完整的 Git 提交消息;允许渲染为多行。
pull-request-title严格 MiniJinja 模板字符串chore(release): bump versionsGitHub Pull Request 标题;渲染结果必须是非空单行文本。

两个模板只暴露与 branches.release 相同的 release.* 上下文。省略字段或整个分区即可保留默认行为;smif initsmif config sync 不会自动写入这个可选分区。无效模板会在修改版本文件或消费变更集之前失败。

[tags]

变更集标签到变更日志标题的映射:

[tags]
feat = "新增功能"
fix = "问题修复"

变更集使用的每个标签都必须在这里存在。标签不会选择发布通道。

[changelog]

字段类型默认值含义
template字符串内置模板渲染完整版本发布块的 MiniJinja 模板。
changeset-template字符串内置模板渲染一条变更集内容的 MiniJinja 模板。

smif init 会写入内置模板,方便直接发现和修改。替换完整发布模板时,必须保留 Semifold 识别版本所需的稳定标记。

[packages.<PackageId>]

[packages.web]
path = "packages/web"
resolver = "nodejs"
publish = false
channel = "rc"
channel-bump = "minor"
depends-on = ["native-core"]
github-release = true
assets = [
  "dist/*.wasm",
  { path = "dist/cli", name = "semifold-linux-x64" },
]
字段类型默认值含义
path路径必需相对于仓库根目录的软件包路径。
resolver软件生态 ID必需该软件包使用的内置适配器或已注册插件。
publish布尔值清单或插件发现结果是否让 Semifold 对该软件包执行 registry pre-check 与发布命令。缺省时不写入配置。
channel字符串stable稳定通道,或 rcbeta 等命名发布通道。
channel-bumppreservepatchminormajor下一次进入命名通道时使用的一次性稳定基线提升方式。
depends-onPackageId 数组[]清单文件无法表达的补充内部依赖关系。
github-release布尔值公开软件包为 true;私有软件包为 false覆盖 GitHub Release 创建策略。
assets字符串或 { path, name } 数组[]上传到该软件包 GitHub Release 的文件或 glob。

旧的 version-mode 字段仍可读取,以便完成配置迁移。新配置应使用 channel

publish 是生态无关的显式覆盖。publish = false 可以阻止 Python、C++ 或内部工具进入软件包仓库流程;publish = true 可以覆盖 Rust publish = false、Node.js private: true 或插件返回的私有标识。覆盖只改变 Semifold 的有效发布资格,不会改写原生清单,也不会绕过 cargo publishnpm publish 等工具自身的限制。

缺省的 github-release 策略基于覆盖后的有效发布资格:可发布软件包默认创建,私有软件包默认不创建。显式 github-release = truefalse 仍可以单独覆盖代码托管平台行为。

[plugins.<ecosystem-id>]

[plugins."com.example.game"]
path = "plugins/game.js"
sha256 = "64-lowercase-hex-characters"
allowed-origins = ["https://api.example.com"]
字段类型默认值含义
path路径必需相对于仓库根目录的一份已打包 ESM 文件。
sha256字符串可选的小写 SHA-256 内容锁。
allowed-originsHTTPS 来源数组[]插件可以通过 fetch 访问的精确来源。路径、通配符、凭据和非 HTTPS 来源都会被拒绝。

插件导出的元数据还会单独声明 read-patterns。只有元数据声明和宿主校验同时允许时,文件读取才会成功。

[resolver.<ecosystem-id>]

即使软件包发现和版本修改来自插件,解析器配置仍然负责实际发布行为。

字段类型默认值含义
pre-checkHTTP 或命令对象检查目标软件包版本是否已经存在。
prepublish命令数组[]在该软件生态的发布命令之前执行。
publish命令数组[]把软件包发布到软件包仓库。
post-version命令数组[]软件包与变更日志修改写入后执行。

HTTP 版本检查

[resolver.rust.pre-check]
type = "http"
url = "https://crates.io/api/v1/crates/{{ package.name }}/{{ package.version }}"
extra-headers = { User-Agent = "Example release automation" }
retry = [2, 5, 15]

HTTP 状态 200 表示版本存在,404 表示不存在,其他状态都会让检查失败。retry 是可重试失败的等待秒数,也可以与有上限的 Retry-After 响应配合。

命令形式的版本检查

[resolver.internal.pre-check]
type = "command"
command = "./scripts/version-exists"
args = ["--json-lines"]
extra-env = { REGISTRY = "internal" }

命令在被检查的软件包目录中运行。stdin 接收单行 PublishPackageContext JSON,并以换行结束;stdout 必须严格只包含一行 {"exists": true}{"exists": false}

命令无法启动、非零退出、无效 JSON 或额外的非空 stdout 内容都会让预检失败。stderr 继承用于诊断。命令 pre-check 在普通发布和全局 --dry-run 中都会执行,因此脚本必须只读且可以安全重复运行。

命令条目

[[resolver.nodejs.publish]]
command = "npm"
args = ["publish", "--provenance", "--access", "public", "--tag", "rc"]
extra-env = { NPM_CONFIG_PROVENANCE = "true" }
stdout = "inherit"
stderr = "inherit"
dry-run = false
字段类型默认值含义
command字符串必需不经过 shell 展开的可执行文件。
args字符串数组[]直接传给可执行文件的参数。
extra-env字符串映射{}额外环境变量。不要把凭据写进提交到仓库的配置。
stdout / stderrinheritpipenullinherit子进程输出策略。
dry-run布尔值false是否明确允许该命令在 --dry-run 预演中运行。

Semifold 不会解释 args 中的 shell 操作符;需要管道或复合 shell 行为时,请把逻辑放进单独的脚本。

模板变量

软件包仓库 URL 和配置命令可以使用软件包作用域的模板上下文。常见值包括:

变量含义
{{ package.name }}清单名称或软件包仓库名称。
{{ package.version }}正在检查或发布的版本。
{{ package.path }}相对于仓库根目录的软件包路径。

变更日志模板会收到更丰富的结构化上下文。请把变更日志定制与软件包仓库命令配置分开,并使用 smif statussmif version --dry-run 验证修改。

本页内容