Use late init to support libjf plugin after lom, add taskgraph plugin
ci/woodpecker/push/pages Pipeline was successful Details
ci/woodpecker/push/gradle Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2022-12-13 23:07:05 +01:00
parent 626c266ead
commit ce189f2087
Signed by: Johannes
GPG Key ID: E76429612C2929F4
5 changed files with 101 additions and 28 deletions

View File

@ -0,0 +1,40 @@
package io.gitlab.jfronny.scripts
interface Either<L, R> {
val isLeft: Boolean
val isRight: Boolean
val left: L?
val right: R?
fun <U> mapLeft(f: (L) -> U): Either<U, R>
fun <U> mapRight(f: (R) -> U): Either<L, U>
fun <U> fold(l: (L) -> U, r: (R) -> U): U
fun foldLeft(f: (L) -> R): R
fun foldRight(f: (R) -> L): L
fun apply(l: (L) -> Unit, r: (R) -> Unit)
data class Left<L, R>(override val left: L) : Either<L, R> {
override val isLeft = true
override val isRight = false
override val right = null
override fun <U> mapLeft(f: (L) -> U): Either<U, R> = Left(f(left))
override fun <U> mapRight(f: (R) -> U): Either<L, U> = Left(left)
override fun <U> fold(l: (L) -> U, r: (R) -> U): U = l(left)
override fun foldRight(f: (R) -> L): L = left
override fun foldLeft(f: (L) -> R): R = f(left)
override fun apply(l: (L) -> Unit, r: (R) -> Unit) = l(left)
}
data class Right<L, R>(override val right: R) : Either<L, R> {
override val isLeft = false
override val isRight = true
override val left = null
override fun <U> mapLeft(f: (L) -> U): Either<U, R> = Right(right)
override fun <U> mapRight(f: (R) -> U): Either<L, U> = Right(f(right))
override fun <U> fold(l: (L) -> U, r: (R) -> U): U = r(right)
override fun foldRight(f: (R) -> L): L = f(right)
override fun foldLeft(f: (L) -> R): R = right
override fun apply(l: (L) -> Unit, r: (R) -> Unit) = r(right)
}
}
fun <T> Either<T, T>.fold(): T = if (isLeft) left!! else right!!

View File

@ -26,10 +26,6 @@ val jfCodegen by tasks.registering {
}
}
tasks.compileJava {
dependsOn(jfCodegen.get())
}
tasks.compileJava { dependsOn(jfCodegen) }
tasks.processResources {
dependsOn(jfCodegen.get())
}
tasks.processResources { dependsOn(jfCodegen) }

View File

@ -0,0 +1,36 @@
import io.gitlab.jfronny.scripts.*
plugins {
base
}
tasks.register("printTaskGraph") {
doLast {
fun getTask(task: Any): Either<Task, String> {
return when (task) {
is Provider<*> -> getTask(task.get())
is String -> Either.Left(tasks.getByPath(task))
is Task -> Either.Left(task)
else -> Either.Right("$task")
}
}
fun printTaskGraph(task: Task, indent: Int, known: MutableSet<Task>) {
if (known.contains(task)) {
println(" ".repeat(indent) + "- ${task.name} (*)")
return
}
known.add(task)
println(" ".repeat(indent) + "- ${task.name}")
task.dependsOn.forEach {
getTask(it).apply({ dependency ->
printTaskGraph(dependency, indent + 1, known)
}, { error ->
println(" ".repeat(indent + 1) + "- UNEXPECTED!: $error")
})
}
}
printTaskGraph(tasks.getByPath(prop("taskGraph", "build")), 0, LinkedHashSet())
}
}

View File

@ -58,7 +58,7 @@ subprojects {
self.tasks.deployDebug.dependsOn(tasks.deployDebug)
self.tasks.deployRelease.dependsOn(tasks.deployRelease)
tasks.named("javadoc").get().enabled = false
tasks.named("javadoc") { enabled = false }
if (name !in devOnlyModules && !sourceSets.testmod.get().resources.isEmpty) {
//TODO register testmods of subprojects as testmodInclude automatically
@ -83,10 +83,10 @@ subprojects {
}
afterEvaluate {
tasks.genClientOnlySources.get().enabled = false
tasks.genCommonSources.get().enabled = false
tasks.unpickClientOnlyJar.get().enabled = false
tasks.unpickCommonJar.get().enabled = false
tasks.genClientOnlySources { enabled = false }
tasks.genCommonSources { enabled = false }
tasks.unpickClientOnlyJar { enabled = false }
tasks.unpickCommonJar { enabled = false }
}
}

View File

@ -101,17 +101,18 @@ earlyAfterEvaluate {
tasks.jar.get().archiveClassifier.set("dev")
// Used for referencing the unremapped jars of other projects
artifacts.add(configurations.create("dev").name, tasks.jar.get().archiveFile.get().asFile) {
artifacts.add(configurations.create("dev").name, tasks.jar) {
type = "jar"
builtBy(tasks.jar.get())
builtBy(tasks.jar)
}
// configure the shadow task to not shadow by default and output to builds/devlibs
tasks.shadowJar {
val inputTask: Jar = tasks.findByName("injectCompiledConfig") as Jar? ?: tasks.jar.get() // get injectCompiledConfig task if present (-> LibJF) or use normal jar task
// get injectCompiledConfig task if present (-> LibJF) or use normal jar task
val inputTask = providers.provider { tasks.findByName("injectCompiledConfig") as Jar? }.orElse(tasks.jar)
dependsOn(inputTask)
configurations.clear()
from(project.configurations.shadow.get(), inputTask.archiveFile.get())
from(project.configurations.shadow, inputTask)
archiveClassifier.set("shadow")
destinationDirectory.set(devlibs)
}
@ -122,24 +123,24 @@ java {
}
// attempt to allow reproducible builds by removing unneeded metadata from jars
tasks.withType<AbstractArchiveTask>() {
tasks.withType<AbstractArchiveTask> {
isPreserveFileTimestamps = false
isReproducibleFileOrder = false
}
// generate remapped jar without JiJ'd dependencies for maven publish
val remapMavenJar by tasks.registering(RemapJarTask::class) {
dependsOn(tasks.shadowJar.get())
inputFile.set(tasks.shadowJar.get().archiveFile.get())
dependsOn(tasks.shadowJar)
inputFile.set(tasks.shadowJar.get().archiveFile)
archiveFileName.set("${archiveBaseName.get()}-${project.versionS}-maven.jar")
addNestedDependencies.set(false)
}
tasks.assemble.get().dependsOn(remapMavenJar.get())
tasks.assemble { dependsOn(remapMavenJar) }
// configure remapJar to use the output of shadow
tasks.remapJar {
dependsOn(tasks.shadowJar.get())
inputFile.set(tasks.shadowJar.get().archiveFile.get())
dependsOn(tasks.shadowJar)
inputFile.set(tasks.shadowJar.get().archiveFile)
archiveFileName.set("${archiveBaseName.get()}-${project.versionS}.jar")
}
@ -155,12 +156,12 @@ publishing {
publications {
create<MavenPublication>("lom") {
from(components["java"])
setArtifacts(listOf(remapMavenJar.get(), tasks.sourcesJar.get()))
setArtifacts(listOf(remapMavenJar, tasks.sourcesJar))
}
}
}
tasks.publish.get().dependsOn(tasks.build.get())
tasks.deployDebug.dependsOn(tasks.publish.get())
tasks.publish { dependsOn(tasks.build) }
tasks.deployDebug.dependsOn(tasks.publish)
// create testmodInclude configuration
val testmodIncludeConfiguration = configurations.create("testmodInclude")
@ -176,14 +177,14 @@ if (hasTestmod) {
afterEvaluate {
// remap configuration for outputting usable testmod jar
val remapTestmodJar by tasks.registering(RemapJarTask::class) {
dependsOn(testmodJar.get())
inputFile.set(testmodJar.get().archiveFile.get())
dependsOn(testmodJar)
inputFile.set(testmodJar.get().archiveFile)
archiveClassifier.set("testmod")
// add nested jars from testmodInclude
addNestedDependencies.set(true)
nestedJars.setFrom(*testmodIncludeConfiguration.files.toTypedArray())
}
tasks.assemble.get().dependsOn(remapTestmodJar.get())
tasks.assemble { dependsOn(remapTestmodJar) }
}
}
@ -205,7 +206,7 @@ afterEvaluate {
tasks.configureEach {
if (this is RemapJarTask) {
this.dependsOn.filterIsInstance<PrepareJarRemapTask>().forEach { prepareTask ->
prepareTask.dependsOn(*this.dependsOn.filter { it != prepareTask }.toTypedArray())
prepareTask.dependsOn(*this.dependsOn.filterNot { it == prepareTask }.toTypedArray())
}
}
}