SBT中Test/envVars未传递至子项目的问题咨询
sbt多项目中Test环境变量未传递到子项目的问题解决
问题场景
在sbt多项目构建中,根级别设置Test / envVars和Test / fork后,根项目的测试可以正常读取到环境变量,但子项目的测试却无法读取,执行sbt test时子项目测试失败。
原build.sbt配置:
ThisBuild / scalaVersion := "3.3.1" Test / envVars := Map("TEST" -> "TEST_ENVVARS") Test / fork := true lazy val subProject = project .in(file("sub-project")) .settings( libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.9" % Test ) ) lazy val root = project .in(file(".")) .aggregate(subProject) .settings( libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.9" % Test ) )
测试用例(根项目和子项目结构一致,仅类名不同):
package example import org.scalatest.flatspec.AnyFlatSpec import scala.util.Properties class RootExampleTest extends AnyFlatSpec { "RootExampleTest" should "read envVars" in { assert(Properties.envOrNone("TEST").nonEmpty) } }
执行sbt test时,RootExampleTest测试通过,SubProjectExampleTest测试失败。
原因
sbt中直接在build.sbt根级别定义的Test / envVars属于当前默认项目(root项目)的设置,不会自动传递给子项目。子项目作为独立的构建单元,除非显式指定,否则不会继承根项目的这类设置。
解决方案
将Test / envVars和Test / fork配置到ThisBuild作用域下,让整个构建的所有项目(包括子项目)都继承该设置:
修改后的build.sbt:
ThisBuild / scalaVersion := "3.3.1" ThisBuild / Test / envVars := Map("TEST" -> "TEST_ENVVARS") ThisBuild / Test / fork := true lazy val subProject = project .in(file("sub-project")) .settings( libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.9" % Test ) ) lazy val root = project .in(file(".")) .aggregate(subProject) .settings( libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.9" % Test ) )
补充说明
如果不需要全局生效,只想让特定子项目继承根项目的环境变量设置,也可以在子项目的settings中显式引用:
lazy val subProject = project .in(file("sub-project")) .settings( Test / envVars := (Test / envVars).value, Test / fork := (Test / fork).value, libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.2.9" % Test ) )
内容的提问来源于stack exchange,提问作者Björn Pedersen
相关产品推荐
相关产品推荐

