From 872db3d8172a94316616f7ce3b489c5017340ce6 Mon Sep 17 00:00:00 2001 From: eugene yokota Date: Thu, 23 Apr 2026 03:32:42 -0400 Subject: [PATCH] [1.x] fix: Fixes managedScalaInstance false support (#9121) (#9123) **Problem** When managedScalaInstance is set to false, we stopped creating ScalaInstance, but the documentation says the user can pull in their own dependencies. **Solution** Attempt to construct a ScalaInstance from update report even when managedScalaInstance is set to false. --- .../src/main/scala/sbt/internal/Compiler.scala | 12 ++++++++---- .../sbt-test/project/scala-instance/A.scala | 5 +++++ .../sbt-test/project/scala-instance/build.sbt | 18 ++++++++++++++++++ .../src/sbt-test/project/scala-instance/test | 3 +++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 sbt-app/src/sbt-test/project/scala-instance/A.scala create mode 100644 sbt-app/src/sbt-test/project/scala-instance/build.sbt create mode 100644 sbt-app/src/sbt-test/project/scala-instance/test diff --git a/main/src/main/scala/sbt/internal/Compiler.scala b/main/src/main/scala/sbt/internal/Compiler.scala index 19756a9de..f08e6545a 100644 --- a/main/src/main/scala/sbt/internal/Compiler.scala +++ b/main/src/main/scala/sbt/internal/Compiler.scala @@ -35,14 +35,18 @@ private[sbt] object Compiler { val app = Keys.appConfiguration.value val managed = Keys.managedScalaInstance.value val sv = Keys.scalaVersion.value + val configs = Keys.ivyConfigurations.value // if this logic changes, ensure that `unmanagedScalaInstanceOnly` and `update` are changed // appropriately to avoid cycles - sh match { - case Some(h) => scalaInstanceFromHome(h) + (sh, extraToolConf) match { + case (Some(h), _) => scalaInstanceFromHome(h) + case _ if !managed => + val extra = extraToolConf.getOrElse(Configurations.ScalaTool) + if (configs.contains(extra)) scalaInstanceFromUpdate(extraToolConf) + else emptyScalaInstance case _ => val scalaProvider = app.provider.scalaProvider - if (!managed) emptyScalaInstance - else if (sv == scalaProvider.version) optimizedScalaInstance(sv, scalaProvider) + if (sv == scalaProvider.version) optimizedScalaInstance(sv, scalaProvider) else scalaInstanceFromUpdate(extraToolConf) } } diff --git a/sbt-app/src/sbt-test/project/scala-instance/A.scala b/sbt-app/src/sbt-test/project/scala-instance/A.scala new file mode 100644 index 000000000..35cd702de --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/A.scala @@ -0,0 +1,5 @@ +package example + +class A { + val x = 1 +} diff --git a/sbt-app/src/sbt-test/project/scala-instance/build.sbt b/sbt-app/src/sbt-test/project/scala-instance/build.sbt new file mode 100644 index 000000000..cc4dd3aa7 --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/build.sbt @@ -0,0 +1,18 @@ +import Configurations.{ ScalaTool, ScalaDocTool } + +@transient +lazy val check = taskKey[Unit]("") +lazy val scala213 = "2.13.16" +scalaVersion := scala213 +autoScalaLibrary := false +managedScalaInstance := false +ivyConfigurations ++= List(ScalaTool, ScalaDocTool) +libraryDependencies ++= Seq( + "org.scala-lang" % "scala-library" % scala213, + "org.scala-lang" % "scala-compiler" % scala213 % ScalaTool, + "org.scala-lang" % "scala-compiler" % scala213 % ScalaDocTool, +) +check := { + val si = scalaInstance.value + assert(si.version == scala213, s"'${si.version}' was not '$scala213'") +} diff --git a/sbt-app/src/sbt-test/project/scala-instance/test b/sbt-app/src/sbt-test/project/scala-instance/test new file mode 100644 index 000000000..58d9fc878 --- /dev/null +++ b/sbt-app/src/sbt-test/project/scala-instance/test @@ -0,0 +1,3 @@ +> compile +> doc +> check