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

sbt项目dependsOn依赖时修改被依赖项目target目录配置不生效如何解决

配置不生效的原因

你将projectA / target的配置写在了projectB的.settings()块中,sbt的配置存在严格的作用域划分:每个项目的settings块默认只定义当前项目自身的属性,你在projectB的settings里修改projectA的属性,实际作用域是「projectB上下文下的projectA/target」,但projectA编译任务读取的是projectA自身作用域下的target属性,因此不会生效。
而命令行执行set命令时,默认修改的是全局ThisBuild作用域下的配置,会覆盖projectA自身的默认配置,因此可以正常生效。

正确配置方案

根据你的需求,有两种常用实现方式:

方式1:全局固定projectA的输出路径(适合不需要单独运行projectA任务的场景)

直接在build.sbt的顶层(不属于任何项目的配置区域),用ThisBuild作用域设置projectA的target,全局生效:

val projectA = project
// 省略其余配置

val projectB = project
.dependsOn(projectA)
// 省略其余配置

// 顶层全局配置,作用于整个构建流程
ThisBuild / projectA / target := (projectB / target).value / "projectA" / "target"

方式2:动态适配输出路径(适合需要同时支持单独运行projectA、projectB任务的场景)

在projectA的配置中动态判断触发任务的项目,自动切换输出路径:

val projectA = project
.settings(
  target := {
    // 判断当前触发编译的项目是否为projectB
    if (sbt.Keys.state.value.contains(sbt.KeyRanks.ProjectSetting, projectB / thisProject)) {
      (projectB / target).value / "projectA" / "target"
    } else {
      // 单独运行projectA任务时,输出到自身默认路径
      target.value
    }
  }
)

val projectB = project
.dependsOn(projectA)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:15:07