如何用Sbt批量发布依赖不同实现的Api包?
动态批量发布依赖不同Impl的Api包方案
核心思路
通过Sbt的动态子项目生成和自定义任务,实现批量创建依赖不同Impl的Api子项目,并一键完成本地发布。
具体配置步骤
假设你的项目目录结构如下:
root/ ├── base/ ├── impl/ │ ├── impl1/ │ ├── impl2/ │ └── ... └── api/
在根项目
build.sbt中定义Impl模块列表
统一维护所有需要关联的Impl模块名称,新增Impl时只需更新这个列表:// 定义存储Impl模块名称的设置项 val implModules = settingKey[Seq[String]]("所有需要关联的Impl模块名称") // 配置当前存在的Impl模块,新增时直接添加即可 implModules := Seq("impl1", "impl2")动态生成依赖对应Impl的Api子项目
基于Impl列表自动创建每个Api派生项目,配置依赖和发布名称:// 遍历Impl模块列表,生成对应的Api子项目 lazy val apiProjects = implModules.value.map { implName => lazy val apiImplProject = Project(id = s"api-$implName", base = file(s"api")) .settings( // 依赖对应的Impl模块 libraryDependencies += rootProject.value.project(s"impl-$implName"), // 自定义发布的Artifact名称,格式为api-implX artifactName := { (sv, module, artifact) => s"api-$implName_${sv.scalaVersion}-${sv.version}.${artifact.extension}" }, // 继承根项目基础配置(版本、Scala版本等) version := version.value, scalaVersion := scalaVersion.value ) apiImplProject } // 将所有动态生成的Api子项目添加到根项目聚合中 lazy val root = (project in file(".")) .aggregate(apiProjects: _*) .settings( name := "my-root-project", version := "1.0.0", scalaVersion := "2.13.12" )创建一键批量发布任务
定义自定义任务,触发所有动态Api项目的本地发布:// 批量发布所有Api-Impl项目到本地仓库 lazy val publishAllApiImpls = taskKey[Unit]("批量发布所有依赖不同Impl的Api包到本地") publishAllApiImpls := { apiProjects.value.foreach { proj => (proj / publishLocal).value } }
使用方式
- 新增Impl模块:在
implModules的Seq中添加新的Impl名称(比如"impl3"),确保impl/impl3目录存在并配置好对base模块的依赖。 - 批量发布:终端执行
sbt publishAllApiImpls,自动将所有api-impl1、api-impl2等包发布到本地仓库。 - 单独发布某一个:执行
sbt api-impl1/publishLocal即可单独发布指定Api包。
注意事项
- 确保每个Impl子项目已正确配置对base模块的依赖。
- 如果Api模块有专属基础配置,可抽成
lazy val apiBaseSettings = Seq(...),让动态生成的Api项目继承该设置。
内容的提问来源于stack exchange,提问作者AminMal
相关产品推荐
相关产品推荐

