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

如何为sbt publishLocal指定专属的项目版本?

解决sbt-ci-release本地发布固定快照版本的方案

你可以通过以下几种方式实现本地用固定快照版本发布,同时保留CI环境下sbt-ci-release的自动发布功能:

方案一:自定义本地发布任务

在build.sbt中添加自定义任务,临时设置固定快照版本后执行publishLocal,完全不影响CI的版本逻辑:

// 获取最新Git标签(自动去掉标签可能带的v前缀)
lazy val latestGitTag = taskKey[String]("Fetch latest Git tag without v prefix")
latestGitTag := {
  sys.process.Process("git describe --abbrev=0 --tags")
    .lineStream.headOption.getOrElse("0.0.0")
    .replaceFirst("^v", "")
}

// 生成下一个版本的快照号(比如最新标签是0.1.2,自动生成0.1.3-SNAPSHOT)
lazy val nextSnapshotVersion = taskKey[String]("Generate next fixed snapshot version")
nextSnapshotVersion := {
  val parts = latestGitTag.value.split("\\.").map(_.toInt)
  val nextPatch = parts.last + 1
  s"${parts(0)}.${parts(1)}.$nextPatch-SNAPSHOT"
}

// 自定义本地发布任务,使用固定快照版本
lazy val publishLocalFixed = taskKey[Unit]("Publish to local repo with fixed snapshot version")
publishLocalFixed := {
  val originalVersion = (ThisBuild / version).value
  // 临时替换版本为固定快照
  (ThisBuild / version) := nextSnapshotVersion.value
  // 执行本地发布
  publishLocal.value
  // 恢复原版本(可选,避免影响其他任务的版本逻辑)
  (ThisBuild / version) := originalVersion
}

之后执行sbt publishLocalFixed就能用固定的快照版本发布到本地仓库,依赖项目无需频繁更新版本号。

方案二:根据环境自动切换版本逻辑

通过判断环境变量区分本地和CI环境,自动切换版本生成规则:

import sbtdynver.DynVerPlugin.autoImport.dynverVersion

// 检测是否处于CI环境(Github Actions会自动设置CI=true)
val isCI = sys.env.get("CI").contains("true")

// CI环境用sbt-dynver生成的版本(sbt-ci-release会处理完整发布流程),本地用固定快照
ThisBuild / version := {
  if (isCI) dynverVersion.value
  else {
    val latestTag = sys.process.Process("git describe --abbrev=0 --tags")
      .lineStream.headOption.getOrElse("0.0.0")
      .replaceFirst("^v", "")
    val parts = latestTag.split("\\.").map(_.toInt)
    s"${parts(0)}.${parts(1)}.${parts.last + 1}-SNAPSHOT"
  }
}

这样本地执行sbt publishLocal会自动使用固定的下一个快照版本,CI环境下sbt-ci-release仍会按原有逻辑生成带哈希的版本或正式发布版本。

方案三:保留version.sbt,CI时移除

如果你习惯用version.sbt管理本地快照版本,可以保留该文件,在CI流程中临时删除它:

  1. 本地保留version.sbt,内容类似:ThisBuild / version := "0.1.3-SNAPSHOT",本地执行sbt publishLocal会直接用这个版本。
  2. 在Github Actions的CI脚本中,添加删除version.sbt的步骤:
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # 必须获取所有Git标签,sbt-dynver需要此配置
      - name: Remove local version config for CI
        run: rm version.sbt
      - name: Publish to Maven Central
        run: sbt ci-release

这样CI环境下sbt-ci-release会接管版本管理,正常生成发布版本,本地则保持固定快照的使用习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:45:50