You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT AutoPlugin中如何在publish任务前执行自定义prePublishCheck任务?

在SBT 1.1.5中配置prePublishCheck前置任务的正确方式

我懂你要实现的需求——在把JAR发布到Artifactory前,先确保Git工作区没有未提交的改动,避免误发布脏代码。你之前试的两种配置没生效,是因为SBT 1.x版本对任务依赖的声明逻辑做了调整,旧的before语法已经不再适用了。

正确配置方案

我们需要先定义检查任务,再让publish任务明确依赖它:

  • 第一步:定义Git工作区检查任务
    先创建任务键,再实现干净度校验的逻辑:

    val prePublishCheck = taskKey[Unit]("校验Git工作区是否干净,阻止脏代码发布")
    
    prePublishCheck := {
      // 调用git命令获取简洁的工作区状态输出
      val gitStatus = sys.process.Process("git status --porcelain").!!.trim
      if (gitStatus.nonEmpty) {
        throw new Exception("Git工作区存在未提交改动!请提交或暂存改动后再执行发布。")
      }
    }
    
  • 第二步:让publish任务绑定前置检查
    在SBT 1.x中,要让任务A在任务B前执行,必须用dependsOn明确声明依赖关系,替换你之前的before写法:

    publish := publish.dependsOn(prePublishCheck).value
    

    如果需要本地发布(publishLocal)也触发同样的检查,可以补充:

    publishLocal := publishLocal.dependsOn(prePublishCheck).value
    

集成到AutoPlugin的写法

如果要把这个校验逻辑放到自定义AutoPlugin里,只需把上述配置放入插件的projectSettings即可:

object PublishValidationPlugin extends AutoPlugin {
  override def trigger = allRequirements
  override def projectSettings = Seq(
    val prePublishCheck = taskKey[Unit]("校验Git工作区是否干净,阻止脏代码发布"),
    prePublishCheck := {
      val gitStatus = sys.process.Process("git status --porcelain").!!.trim
      if (gitStatus.nonEmpty) {
        throw new Exception("Git工作区存在未提交改动!请提交或暂存改动后再执行发布。")
      }
    },
    publish := publish.dependsOn(prePublishCheck).value,
    publishLocal := publishLocal.dependsOn(prePublishCheck).value
  )
}

这样配置后,只要执行sbt publish或sbt publishLocal,prePublishCheck就会自动优先执行;如果工作区不干净,任务会直接抛出异常终止发布流程,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Neil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:19:09