From ebc11f04a74ac351bca17b1de8dd40b4ce20f29a Mon Sep 17 00:00:00 2001 From: calm <148254234+calm329@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:19:24 -0800 Subject: [PATCH] [2.x] fix: Fix updateSbtClassifiers using wrong Scala version for cross-built plugins (#8495) **Problem** When cross-building sbt plugins with explicit `scalaVersion` set in `build.sbt`, the `updateSbtClassifiers` task fails because it uses the launcher's Scala version instead of the appropriate Scala version for the target sbt version. For example, with this configuration: ```scala lazy val root = (project in file(".")) .enablePlugins(SbtPlugin) .settings( scalaVersion := "2.10.7", // Explicit for IDE support crossSbtVersions := Seq("0.13.17", "1.0.0"), ) ``` Running sbt "show updateSbtClassifiers" would fail with: Error downloading org.scala-sbt:scripted-plugin_2.12:0.13.17 It should look for scripted-plugin_2.10:0.13.17 since sbt 0.13.x uses Scala 2.10. **Solution** Modified sbtClassifiersTasks in Defaults.scala to: 1. Check if the project is an sbt plugin (sbtPlugin.value) 2. For plugins, derive the Scala version from pluginCrossBuild / sbtBinaryVersion using PluginCross.scalaVersionFromSbtBinaryVersion 3. For non-plugins, continue using the launcher's Scala version (original behavior) --- main/src/main/scala/sbt/Defaults.scala | 8 +++++++- .../build.sbt | 18 ++++++++++++++++++ .../project/build.sbt | 1 + .../test | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/build.sbt create mode 100644 sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/project/build.sbt create mode 100644 sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index b7b51cc0a..1ec5c34b1 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -3550,7 +3550,13 @@ object Classpaths { classifiersModule := Def.uncached(classifiersModuleTask.value), // Redefine scalaVersion and scalaBinaryVersion specifically for the dependency graph used for updateSbtClassifiers task. // to fix https://github.com/sbt/sbt/issues/2686 - scalaVersion := appConfiguration.value.provider.scalaProvider.version, + // For sbt plugins, use the Scala version corresponding to the sbt binary version being targeted. + // to fix https://github.com/sbt/sbt/issues/8026 + scalaVersion := { + val isPlugin = sbtPlugin.value + if (isPlugin) (pluginCrossBuild / scalaVersion).value + else appConfiguration.value.provider.scalaProvider.version + }, scalaBinaryVersion := binaryScalaVersion(scalaVersion.value), scalaEarlyVersion := CrossVersion.earlyScalaVersion(scalaVersion.value), scalaOrganization := ScalaArtifacts.Organization, diff --git a/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/build.sbt b/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/build.sbt new file mode 100644 index 000000000..6c097accc --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/build.sbt @@ -0,0 +1,18 @@ +// Test for https://github.com/sbt/sbt/issues/8026 +// When building sbt plugins with explicit scalaVersion set, +// updateSbtClassifiers should use the correct Scala version for the sbt version. + +lazy val root = (project in file(".")) + .enablePlugins(SbtPlugin) + .settings( + name := "test-sbt-cross-build", + + // Explicitly set scala version - this is what caused the issue in #8026 + // When scalaVersion is explicitly set, updateSbtClassifiers was using the + // launcher's Scala version instead of the plugin's Scala version. + // Before the fix, this would fail with: + // Error downloading org.scala-sbt:scripted-plugin_2.12:0.13.17 + // because it used the launcher's Scala version (2.12) instead of the + // plugin's target Scala version derived from sbt binary version. + scalaVersion := "2.12.21", + ) diff --git a/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/project/build.sbt b/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/project/build.sbt new file mode 100644 index 000000000..b090aa9d7 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/project/build.sbt @@ -0,0 +1 @@ +ThisBuild / pluginCrossBuild / sbtVersion := "2.0.0" diff --git a/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/test b/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/test new file mode 100644 index 000000000..00ad751bf --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/i8026-update-sbt-classifiers-cross-plugin/test @@ -0,0 +1 @@ +> updateSbtClassifiers