如何在sbt中复用已有Task并自定义设置 以Docker镜像发布为例
实现方案
sbt不支持在任务执行阶段修改设置值,所有针对特定任务的专属配置都需要通过作用域(Scope) 绑定实现,这也是这类自定义任务的标准实现方式。
完整配置步骤如下:
- 首先声明自定义任务键
// 在build.sbt或项目对应sbt配置文件中添加任务定义 val publishMyReg = taskKey[Unit]("发布Docker镜像到私有仓库myregistry.foo.bar")
- 为自定义任务绑定专属配置,该配置仅在
publishMyReg的执行上下文中生效,不会影响原有publishLocal任务的行为
// 仅对Docker配置域下的publishMyReg任务重写镜像地址 Docker / publishMyReg / dockerAlias := (Docker / dockerAlias).value.withRegistryHost(Some("myregistry.foo.bar"))
- 复用
publishLocal的任务逻辑,让其在自定义任务的配置作用域下执行
Docker / publishMyReg := inScope(ThisScope.in(task = publishMyReg.key))(Docker / publishLocal).value
配置完成后即可直接执行你需要的命令:
sbt my-project/docker:publishMyReg
原写法失效说明
之前的实现是在任务执行代码块中修改dockerAlias,但sbt的所有设置值会在任务启动前完成全部解析,执行阶段修改设置不会生效,也不符合sbt的配置模型。该场景不需要使用Command实现,Task配合Scope即可完全支持项目/配置:任务形式的调用。
内容的提问来源于stack exchange,提问作者leozilla
相关产品推荐
相关产品推荐

