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
相关产品推荐
相关产品推荐

