sbt-release 进阶玩法:如何把任意 sbt 任务转换成发布步骤
【免费下载链接】sbt-releaseA release plugin for sbt项目地址: https://gitcode.com/gh_mirrors/sb/sbt-release
sbt-release 是一款专为 Scala/sbt 项目打造的开源发布插件,它把版本确认、测试、打包、打标签、推送等操作编排成一条可定制的发布步骤流水线。它的强大之处在于:默认流程只是起点,你可以把任意 sbt 任务(Task)、输入任务(InputTask)甚至命令(Command)轻松转换成发布步骤(ReleaseStep),打造完全属于自己的自动化发布流程。本文用最通俗的方式,带你快速掌握这个进阶玩法。
什么是 ReleaseStep:sbt-release 发布步骤的核心结构
在 sbt-release 中,整个发布过程就是一个Seq[ReleaseStep],存放在releaseProcess设置里。每个ReleaseStep由三部分组成:
- action:真正执行该步骤的动作;
- check:发布开始前的前置校验(可选);
- enableCrossBuild:是否参与跨 Scala 版本构建(可选)。
默认的发布流程由ReleaseStateTransformations提供,依次执行:检查快照依赖 → 询问版本号 → clean → 测试 → 写入发布版本 → 提交 → 打标签 → 发布产物 → 写入下个开发版本 → 提交 → 推送。这套内置步骤定义在src/main/scala/ReleaseExtra.scala中,源码里的releaseProcess默认值则位于src/main/scala/ReleasePlugin.scala。
4 个官方转换工具:快速把 sbt 任务变成发布步骤
sbt-release 在插件入口src/main/scala/ReleasePlugin.scala的autoImport里内置了 4 个“变身工具”,直接开箱即用:
- releaseStepTask:运行单个任务,不聚合子项目,适合只针对当前项目的操作;
- releaseStepTaskAggregated:以聚合方式运行任务,多模块项目下每个子项目都会执行;
- releaseStepInputTask:运行输入任务,还能附带参数,比如执行某个指定测试;
- releaseStepCommand:运行命令,既支持
Command对象,也支持直接写命令字符串。
实战配置:把自定义任务加入发布流程的 3 个步骤
我们以“发布前生成一份变更说明”为例,三步搞定。
第一步:在 build.sbt 中定义你自己的任务
lazy val generateReleaseNotes = taskKeyUnit generateReleaseNotes := { IO.write(target.value / "RELEASE_NOTES.md", "本次发布内容...") }第二步:用转换工具包装任务并重写 releaseProcess
import ReleaseTransformations._ releaseProcess := SeqReleaseStep第三步:照常执行sbt release,你的任务就会按顺序出现在发布流程中,无需任何额外操作。
官方还提供了一个完整的示例工程src/sbt-test/sbt-release/tasks-as-steps/build.sbt,里面演示了releaseStepTask、releaseStepTaskAggregated、releaseStepInputTask、releaseStepCommand的全部用法,对应的验收清单在src/sbt-test/sbt-release/tasks-as-steps/test中,非常值得参考。
进阶技巧:如何让发布在任务失败时自动中止
发布流程的安全性同样关键。sbt-release 的机制很简单:只要你的任务在执行中抛出异常或调用sys.error,整个发布就会立即中止,不会继续打标签或推送。这让“前置检查类”任务特别有用,比如校验版本号格式、检查发布说明是否存在、确认组织名是否合法等。
此外,你还可以利用ReleaseStep的check字段做发布开始前的预检:即使某个步骤在流程末尾才执行,它的check也会在发布会话启动时先跑一遍,提前拦截不满足条件的发布请求,避免中途失败。
小结与更多玩法
sbt-release 的进阶之路并不复杂:任务负责干活,releaseStepXxx负责“包装”,releaseProcess负责编排。掌握了这套机制,你就能自由组合官方步骤、自定义任务与自定义命令,构建真正贴合团队流程的自动化发布方案。想深入理解实现细节,可以翻阅src/main/scala/ReleasePlugin.scala的转换工具源码,以及src/main/scala/Version.scala中的版本号递增策略(Bump.Major、Bump.Next等)。把任何 sbt 任务变成发布步骤,就这么简单!
【免费下载链接】sbt-releaseA release plugin for sbt项目地址: https://gitcode.com/gh_mirrors/sb/sbt-release
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考