From 6491e50449fbcf681b92edd3d9d130975ac8d5d0 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 22 Sep 2024 00:53:10 -0400 Subject: [PATCH] fix: skip publish on synthetic aggregate root **Problem** There's been previous attempt like 1878 to skip publishing of the root, but it seems like the behavior has regressed at some point in time. **Solution** This skips publishing on synthetic aggregate root project. --- main/src/main/scala/sbt/internal/BuildDef.scala | 17 ++++++++++++----- main/src/main/scala/sbt/internal/Load.scala | 2 +- .../parent-skip-publish/build.sbt | 11 +++++++++++ .../parent-skip-publish/test | 3 +++ 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 sbt-app/src/sbt-test/dependency-management/parent-skip-publish/build.sbt create mode 100644 sbt-app/src/sbt-test/dependency-management/parent-skip-publish/test diff --git a/main/src/main/scala/sbt/internal/BuildDef.scala b/main/src/main/scala/sbt/internal/BuildDef.scala index 26f03b795..b68008dbb 100644 --- a/main/src/main/scala/sbt/internal/BuildDef.scala +++ b/main/src/main/scala/sbt/internal/BuildDef.scala @@ -10,12 +10,13 @@ package sbt package internal import java.io.File -import Keys.{ organization, thisProject, autoGeneratedProject } +import Keys.{ organization, thisProject, autoGeneratedProject, publish, publishLocal, skip } import Def.Setting // import sbt.ProjectExtra.apply import sbt.io.Hash import sbt.internal.util.{ Attributed, StringAttributeMap } import sbt.internal.inc.{ FileAnalysisStore, ReflectUtilities } +import sbt.SlashSyntax0.* import xsbti.{ FileConverter, VirtualFileRef } import xsbti.compile.CompileAnalysis @@ -42,7 +43,7 @@ private[sbt] object BuildDef: } def defaultAggregated(id: String, aggregate: Seq[ProjectRef]): BuildDef = new BuildDef { - override def projectDefinitions(base: File) = + override def projectDefinitions(base: File): Seq[Project] = defaultAggregatedProject(id, base, aggregate) :: Nil } @@ -55,12 +56,18 @@ private[sbt] object BuildDef: def defaultAggregatedProject(id: String, base: File, agg: Seq[ProjectRef]): Project = defaultProject(id, base).aggregate(agg: _*) - private[sbt] def generatedRootWithoutIvyPlugin( + private[sbt] def generatedRootSkipPublish( id: String, base: File, agg: Seq[ProjectRef] ): Project = - Project.mkGeneratedRoot(id, base, agg).settings(defaultProjectSettings) + Project + .mkGeneratedRoot(id, base, agg) + .settings( + defaultProjectSettings, + publish / skip := true, + publishLocal / skip := true, + ) private[sbt] def defaultProjectSettings: Seq[Setting[_]] = Seq( // TODO - Can we move this somewhere else? ordering of settings is causing this to get borked. @@ -72,7 +79,7 @@ private[sbt] object BuildDef: case _ => "default" } }, - autoGeneratedProject := true + autoGeneratedProject := true, ) def analyzed( diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index a555d1f57..48d1b54d1 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -1061,7 +1061,7 @@ private[sbt] object Load { val refs = existingIds.map(id => ProjectRef(buildUri, id)) if (discovered.isEmpty || java.lang.Boolean.getBoolean("sbt.root.ivyplugin")) BuildDef.defaultAggregatedProject(defaultID, buildBase, refs) - else BuildDef.generatedRootWithoutIvyPlugin(defaultID, buildBase, refs) + else BuildDef.generatedRootSkipPublish(defaultID, buildBase, refs) } (root, false, Nil, otherProjects) val (finalRoot, projectLevelExtra) = diff --git a/sbt-app/src/sbt-test/dependency-management/parent-skip-publish/build.sbt b/sbt-app/src/sbt-test/dependency-management/parent-skip-publish/build.sbt new file mode 100644 index 000000000..8b21bea68 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/parent-skip-publish/build.sbt @@ -0,0 +1,11 @@ +ThisBuild / organization := "com.example" +ThisBuild / ivyPaths := IvyPaths((ThisBuild / baseDirectory).value.toString, Some(((ThisBuild / baseDirectory).value / "ivy" / "cache").toString)) + +name := "root" + +lazy val core = project + .settings( + name := "core", + // organization := "com.example", + ivyPaths := IvyPaths((ThisBuild / baseDirectory).value.toString, Some(((ThisBuild / baseDirectory).value / "ivy" / "cache").toString)) + ) diff --git a/sbt-app/src/sbt-test/dependency-management/parent-skip-publish/test b/sbt-app/src/sbt-test/dependency-management/parent-skip-publish/test new file mode 100644 index 000000000..7236d01ce --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/parent-skip-publish/test @@ -0,0 +1,3 @@ +> publishLocal + +$ absent ivy/cache/local/com.example/root_3/0.1.0-SNAPSHOT/poms/root_3.pom