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
相关产品推荐
相关产品推荐

