From c18284948d107348014877d401d001d153baaedb Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Wed, 15 Jan 2020 10:59:36 -0800 Subject: [PATCH 1/2] Bump sbt version --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index 00b48d978..a82bb05e1 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.3.6 +sbt.version=1.3.7 From 17deb8b5d6de4b77e11d42c50c6e7f665556ec93 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sun, 12 Jan 2020 13:20:41 -0800 Subject: [PATCH 2/2] Make publishLocalBin work without prior publishLocal In order for the sbt launcher to be able to resolve a local version of sbt, we must publish the main jar, the sources jar, the doc jar, the pom and an ivy.xml file. The publish and publishLocal tasks are wired in IvyXml.scala to create an ivy.xml file before running publish. This wasn't done with publishLocalBin which made it not work when no ivy.xml file was already present (which was the case after running clean). --- .../internal/librarymanagement/IvyXml.scala | 2 +- project/PublishBinPlugin.scala | 65 ++++++++++++++----- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala b/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala index 95f5bb24f..3bf8cb059 100644 --- a/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala +++ b/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala @@ -180,7 +180,7 @@ object IvyXml { } - private def makeIvyXmlBefore[T]( + private[sbt] def makeIvyXmlBefore[T]( task: TaskKey[T], shadedConfigOpt: Option[Configuration] ): Setting[Task[T]] = diff --git a/project/PublishBinPlugin.scala b/project/PublishBinPlugin.scala index a3a890819..804f6461a 100644 --- a/project/PublishBinPlugin.scala +++ b/project/PublishBinPlugin.scala @@ -1,7 +1,11 @@ -import sbt._, Keys._ +package sbt -import sbt.librarymanagement.PublishConfiguration -import sbt.librarymanagement.ConfigRef +import java.nio.charset.StandardCharsets.UTF_8 +import java.nio.file.{ FileAlreadyExistsException, Files } + +import org.apache.ivy.core.module.id.ModuleRevisionId +import sbt.Keys._ +import sbt.internal.librarymanagement.{ IvySbt, IvyXml } /** This local plugin provides ways of publishing just the binary jar. */ object PublishBinPlugin extends AutoPlugin { @@ -13,22 +17,51 @@ object PublishBinPlugin extends AutoPlugin { } import autoImport._ - override def globalSettings = Seq(publishLocalBin := (())) + private val dummyDoc = taskKey[File]("").withRank(Int.MaxValue) + override val globalSettings = Seq(publishLocalBin := (())) - override def projectSettings = Def settings ( + override val projectSettings: Seq[Def.Setting[_]] = Def settings ( publishLocalBin := Classpaths.publishTask(publishLocalBinConfig).value, - publishLocalBinConfig := { - Classpaths.publishConfig( - false, // publishMavenStyle.value, - Classpaths.deliverPattern(crossTarget.value), - if (isSnapshot.value) "integration" else "release", - ivyConfigurations.value.map(c => ConfigRef(c.name)).toVector, - (packagedArtifacts in publishLocalBin).value.toVector, - (checksums in publishLocalBin).value.toVector, - logging = ivyLoggingLevel.value, - overwrite = isSnapshot.value + publishLocalBinConfig := Classpaths.publishConfig( + false, // publishMavenStyle.value, + Classpaths.deliverPattern(crossTarget.value), + if (isSnapshot.value) "integration" else "release", + ivyConfigurations.value.map(c => ConfigRef(c.name)).toVector, + (packagedArtifacts in publishLocalBin).value.toVector, + (checksums in publishLocalBin).value.toVector, + logging = ivyLoggingLevel.value, + overwrite = isSnapshot.value + ), + publishLocalBinConfig := publishLocalBinConfig + .dependsOn( + // Copied from sbt.internal. + Def.taskDyn { + val doGen = useCoursier.value + if (doGen) + Def.task { + val currentProject = { + val proj = csrProject.value + val publications = csrPublications.value + proj.withPublications(publications) + } + IvyXml.writeFiles(currentProject, None, ivySbt.value, streams.value.log) + } else + Def.task(()) + } ) + .value, + dummyDoc := { + val dummyFile = streams.value.cacheDirectory / "doc.jar" + try { + Files.createDirectories(dummyFile.toPath.getParent) + Files.createFile(dummyFile.toPath) + } catch { case _: FileAlreadyExistsException => } + dummyFile }, - packagedArtifacts in publishLocalBin := Classpaths.packaged(Seq(packageBin in Compile)).value + dummyDoc / packagedArtifact := (Compile / packageDoc / artifact).value -> dummyDoc.value, + packagedArtifacts in publishLocalBin := + Classpaths + .packaged(Seq(packageBin in Compile, packageSrc in Compile, makePom, dummyDoc)) + .value ) }