如何为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流程中临时删除它:
- 本地保留
version.sbt,内容类似:ThisBuild / version := "0.1.3-SNAPSHOT",本地执行sbt publishLocal会直接用这个版本。 - 在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
相关产品推荐
相关产品推荐

