sbt/project/PublishBinPlugin.scala

69 lines
2.3 KiB
Scala

package sbt
import java.nio.file.{ FileAlreadyExistsException, Files }
import sbt.Keys.*
import sbt.internal.librarymanagement.IvyXml
/** This local plugin provides ways of publishing just the binary jar. */
object PublishBinPlugin extends AutoPlugin {
override def trigger = allRequirements
object autoImport {
val publishLocalBin = taskKey[Unit]("")
val publishLocalBinConfig = taskKey[PublishConfiguration]("")
}
import autoImport.*
private val dummyDoc = taskKey[File]("").withRank(Int.MaxValue)
override val globalSettings = Seq(publishLocalBin := (()))
override val projectSettings: Seq[Def.Setting[?]] = Def settings (
publishLocalBin := Classpaths
.publishOrSkip(publishLocalBinConfig, publishLocalBin / skip)
.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,
(publishLocalBin / packagedArtifacts).value.toVector,
(publishLocalBin / checksums).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
},
dummyDoc / packagedArtifact := (Compile / packageDoc / artifact).value -> dummyDoc.value,
publishLocalBin / packagedArtifacts :=
Classpaths
.packaged(Seq(Compile / packageBin, Compile / packageSrc, makePom, dummyDoc))
.value
)
}