Skip to content

Commit ac09acf

Browse files
authored
Create plugin for Scala publishing conventions (#169)
1 parent 58c6340 commit ac09acf

8 files changed

+115
-124
lines changed

buildSrc/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ plugins {
55
repositories {
66
mavenCentral()
77
gradlePluginPortal()
8-
}
8+
}

buildSrc/src/main/kotlin/Predef.kt

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import org.gradle.api.Project
2+
3+
internal fun Project.configValue(propertyName: String, environmentVariableName: String): String? {
4+
val property: String? = project.properties[propertyName]?.toString()
5+
val environmentVariable: String? = System.getenv(environmentVariableName)
6+
7+
val configValue = property ?: environmentVariable
8+
9+
return configValue.also {
10+
if (configValue.isNullOrBlank()) {
11+
errorMessage(
12+
"$propertyName Gradle property and " +
13+
"$environmentVariableName environment variable are missing",
14+
)
15+
}
16+
}
17+
}
18+
19+
internal fun Project.errorMessage(message: String) = logger.lifecycle("$YELLOW$message$RESET")
20+
21+
private const val RESET = "\u001B[0m"
22+
private const val YELLOW = "\u001B[0;33m"

buildSrc/src/main/kotlin/ScalaDocumentationPlugin.kt

-15
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import org.gradle.api.Plugin
2+
import org.gradle.api.Project
3+
import org.gradle.api.plugins.BasePlugin
4+
import org.gradle.api.plugins.BasePluginExtension
5+
import org.gradle.api.publish.PublishingExtension
6+
import org.gradle.api.publish.maven.MavenPublication
7+
import org.gradle.api.tasks.TaskProvider
8+
import org.gradle.api.tasks.bundling.Jar
9+
import org.gradle.kotlin.dsl.findByType
10+
import org.gradle.kotlin.dsl.get
11+
import org.gradle.kotlin.dsl.register
12+
import org.gradle.plugins.signing.SigningExtension
13+
14+
class ScalaPublishingConventionsPlugin : Plugin<Project> {
15+
override fun apply(project: Project): Unit = project.run {
16+
val scaladocJarTask: TaskProvider<Jar> = tasks.register<Jar>("scaladocJar") {
17+
group = BasePlugin.BUILD_GROUP
18+
tasks.findByName("scaladoc")?.let { dependsOn(it) }
19+
?: errorMessage("The scaladoc task was not found. The Javadoc jar file won't contain any documentation")
20+
archiveClassifier.set("javadoc")
21+
from("$buildDir/docs/scaladoc")
22+
}
23+
24+
val publishingExtension: PublishingExtension =
25+
extensions.findByType<PublishingExtension>()
26+
?: throw IllegalStateException("The Maven Publish plugin is required to publish the build artifacts")
27+
28+
val signingExtension: SigningExtension =
29+
extensions.findByType<SigningExtension>()
30+
?: throw IllegalStateException("The Signing plugin is required to digitally sign the built artifacts")
31+
32+
val basePluginExtension: BasePluginExtension =
33+
extensions.findByType<BasePluginExtension>()
34+
?: throw IllegalStateException("The Base plugin is required to configure the name of artifacts")
35+
36+
publishingExtension.run {
37+
publications {
38+
register<MavenPublication>("maven") {
39+
val scala3Suffix = "_3"
40+
41+
artifactId = basePluginExtension.archivesName.get() + scala3Suffix
42+
from(components["java"])
43+
artifact(scaladocJarTask)
44+
45+
pom {
46+
name.set(project.properties["pom.name"]?.toString())
47+
description.set(project.properties["pom.description"]?.toString())
48+
url.set(project.properties["pom.url"]?.toString())
49+
50+
licenses {
51+
license {
52+
name.set(project.properties["pom.license.name"]?.toString())
53+
url.set(project.properties["pom.license.url"]?.toString())
54+
}
55+
}
56+
57+
developers {
58+
developer {
59+
id.set(project.properties["pom.developer.id"].toString())
60+
name.set(project.properties["pom.developer.name"].toString())
61+
}
62+
}
63+
64+
scm {
65+
url.set(project.properties["pom.smc.url"].toString())
66+
connection.set(project.properties["pom.smc.connection"].toString())
67+
developerConnection.set(project.properties["pom.smc.developerConnection"].toString())
68+
}
69+
}
70+
}
71+
}
72+
}
73+
74+
signingExtension.run {
75+
val isLocal = gradle.startParameter.taskNames.any { it.contains("publishToMavenLocal", ignoreCase = true) }
76+
val signingKeyId: String? = configValue("signing.keyId", "SIGNING_KEY_ID")
77+
val signingKey: String? = configValue("signing.key", "SIGNING_KEY")
78+
val signingPassphrase: String? = configValue("signing.passphrase", "SIGNING_KEY_PASSPHRASE")
79+
80+
isRequired = !isLocal
81+
useGpgCmd()
82+
useInMemoryPgpKeys(signingKeyId, signingKey, signingPassphrase)
83+
sign(publishingExtension.publications)
84+
}
85+
}
86+
}

buildSrc/src/main/kotlin/xef-scala-documentation.gradle.kts

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
apply<ScalaPublishingConventionsPlugin>()

scala-cats/build.gradle.kts

+3-55
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
signing
77
alias(libs.plugins.semver.gradle)
88
alias(libs.plugins.spotless)
9-
`xef-scala-documentation`
9+
`xef-scala-publishing-conventions`
1010
}
1111

1212
dependencies {
@@ -18,10 +18,8 @@ dependencies {
1818
}
1919

2020
java {
21-
sourceCompatibility = JavaVersion.VERSION_11
22-
targetCompatibility = JavaVersion.VERSION_11
2321
toolchain {
24-
languageVersion = JavaLanguageVersion.of(11)
22+
languageVersion.set(JavaLanguageVersion.of(11))
2523
}
2624
withSourcesJar()
2725
}
@@ -34,58 +32,8 @@ tasks.withType<ScalaCompile> {
3432
scalaCompileOptions.additionalParameters = listOf("-Wunused:all", "-Wvalue-discard")
3533
}
3634

37-
publishing {
38-
publications {
39-
register<MavenPublication>("maven") {
40-
val scala3Suffix = "_3"
41-
from(components["java"])
42-
artifact(tasks.named("scaladocJar"))
43-
44-
artifactId = base.archivesName.get() + scala3Suffix
45-
46-
pom {
47-
name.set(project.properties["pom.name"]?.toString())
48-
description.set(project.properties["pom.description"]?.toString())
49-
url.set(project.properties["pom.url"]?.toString())
50-
51-
licenses {
52-
license {
53-
name.set(project.properties["pom.license.name"]?.toString())
54-
url.set(project.properties["pom.license.url"]?.toString())
55-
}
56-
}
57-
58-
developers {
59-
developer {
60-
id.set(project.properties["pom.developer.id"].toString())
61-
name.set(project.properties["pom.developer.name"].toString())
62-
}
63-
}
64-
65-
scm {
66-
url.set(project.properties["pom.smc.url"].toString())
67-
connection.set(project.properties["pom.smc.connection"].toString())
68-
developerConnection.set(project.properties["pom.smc.developerConnection"].toString())
69-
}
70-
}
71-
}
72-
}
73-
}
74-
75-
signing {
76-
val isLocal = gradle.startParameter.taskNames.any { it.contains("publishToMavenLocal", ignoreCase = true) }
77-
val signingKeyId: String? = System.getenv("SIGNING_KEY_ID")
78-
val signingKey: String? = System.getenv("SIGNING_KEY")
79-
val signingPassphrase: String? = System.getenv("SIGNING_KEY_PASSPHRASE")
80-
81-
isRequired = !isLocal
82-
useGpgCmd()
83-
useInMemoryPgpKeys(signingKeyId, signingKey, signingPassphrase)
84-
sign(publishing.publications)
85-
}
86-
8735
spotless {
8836
scala {
8937
scalafmt("3.7.3").configFile(".scalafmt.conf").scalaMajorVersion("2.13")
9038
}
91-
}
39+
}

scala/build.gradle.kts

+2-52
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
signing
77
alias(libs.plugins.semver.gradle)
88
alias(libs.plugins.spotless)
9-
`xef-scala-documentation`
9+
`xef-scala-publishing-conventions`
1010
}
1111

1212
dependencies {
@@ -40,58 +40,8 @@ tasks.withType<ScalaCompile> {
4040
scalaCompileOptions.additionalParameters = listOf("-Wunused:all", "-Wvalue-discard")
4141
}
4242

43-
publishing {
44-
publications {
45-
register<MavenPublication>("maven") {
46-
val scala3Suffix = "_3"
47-
from(components["java"])
48-
artifact(tasks.named("scaladocJar"))
49-
50-
artifactId = base.archivesName.get() + scala3Suffix
51-
52-
pom {
53-
name.set(project.properties["pom.name"]?.toString())
54-
description.set(project.properties["pom.description"]?.toString())
55-
url.set(project.properties["pom.url"]?.toString())
56-
57-
licenses {
58-
license {
59-
name.set(project.properties["pom.license.name"]?.toString())
60-
url.set(project.properties["pom.license.url"]?.toString())
61-
}
62-
}
63-
64-
developers {
65-
developer {
66-
id.set(project.properties["pom.developer.id"].toString())
67-
name.set(project.properties["pom.developer.name"].toString())
68-
}
69-
}
70-
71-
scm {
72-
url.set(project.properties["pom.smc.url"].toString())
73-
connection.set(project.properties["pom.smc.connection"].toString())
74-
developerConnection.set(project.properties["pom.smc.developerConnection"].toString())
75-
}
76-
}
77-
}
78-
}
79-
}
80-
81-
signing {
82-
val isLocal = gradle.startParameter.taskNames.any { it.contains("publishToMavenLocal", ignoreCase = true) }
83-
val signingKeyId: String? = System.getenv("SIGNING_KEY_ID")
84-
val signingKey: String? = System.getenv("SIGNING_KEY")
85-
val signingPassphrase: String? = System.getenv("SIGNING_KEY_PASSPHRASE")
86-
87-
isRequired = !isLocal
88-
useGpgCmd()
89-
useInMemoryPgpKeys(signingKeyId, signingKey, signingPassphrase)
90-
sign(publishing.publications)
91-
}
92-
9343
spotless {
9444
scala {
9545
scalafmt("3.7.3").configFile(".scalafmt.conf").scalaMajorVersion("2.13")
9646
}
97-
}
47+
}

0 commit comments

Comments
 (0)