Skip to content

Commit

Permalink
Speed up build (#59)
Browse files Browse the repository at this point in the history
* Split shadow task into source and dependency shadowing

Speeds up assembly from ~2 minutes to ~25 seconds

* Fix build, clean up

* Use Jar for combinedShadowJar

Slightly faster: ~5.443s -> ~4.813s

* Add option to skip javadoc

Reduces assemble time by 6 seconds

* Update shadowJar comment

* Move mainShadowJar relocation configuration inside doFirst block

Avoids early dependency resolution

* Get rid of shadowJar
  • Loading branch information
makamys authored Feb 15, 2024
1 parent 7b7ed6b commit 283b7f9
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 19 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
run: chmod +x gradlew

- name: Build the Gradle plugin
run: ./gradlew --info --stacktrace retrofuturagradle:shadowJar
run: ./gradlew --info --stacktrace retrofuturagradle:jar

- name: Build and locally install the javac plugin
run: ./gradlew --info --stacktrace retrofuturagradle:rfgJavacPlugin:publishToMavenLocal
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-tags.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
run: chmod +x gradlew

- name: Build the Gradle plugin
run: ./gradlew --info --stacktrace retrofuturagradle:shadowJar
run: ./gradlew --info --stacktrace retrofuturagradle:jar

- name: Build the javac plugin
run: ./gradlew --info --stacktrace retrofuturagradle:rfgJavacPlugin:shadowJar
Expand Down
92 changes: 75 additions & 17 deletions plugin/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import java.util.*
import java.util.jar.JarFile

/*
* This file was generated by the Gradle 'init' task.
Expand Down Expand Up @@ -178,20 +180,6 @@ tasks.withType<Javadoc>().configureEach {
}
}

tasks.shadowJar {
from("LICENSE", "docs", tasks.named("classes"))
val oldAsmJarTask = project(":oldasmwrapper").tasks.named<Jar>("allJar")
dependsOn(oldAsmJarTask)
from(zipTree(oldAsmJarTask.get().archiveFile)) // cheaper shadow of an already shaded jar

exclude("META-INF/gradle-plugins/de.*")
exclude("META-INF/versions/9/module-info.class")
exclude("META-INF/LICENSE")
exclude("META-INF/LICENSE*")
exclude("META-INF/NOTICE")
exclude("META-INF/NOTICE*")
}

spotless {
encoding("UTF-8")

Expand Down Expand Up @@ -243,15 +231,85 @@ java {
withJavadocJar()
}

tasks.shadowJar.configure {
archiveClassifier.set("")
if(project.properties["rfg.skipJavadoc"].toString().toBoolean()) {
tasks.named("javadoc").configure { enabled = false }
}

val depsShadowJar = tasks.register<ShadowJar>("depsShadowJar") {
archiveClassifier.set("deps")
archiveVersion.set("0.0") // constant version to prevent task from rerunning when project version changes
isEnableRelocation = true
relocationPrefix = "com.gtnewhorizons.retrofuturagradle.shadow"
configurations.add(project.configurations.runtimeClasspath.get())
dependencies {
// we're already shading this in combinedShadowJar
exclude(project(":oldasmwrapper"))
}
}

val mainShadowJar = tasks.register<ShadowJar>("mainShadowJar") {
archiveClassifier.set("mainShadow")

from(sourceSets.main.get().output)

doFirst {
// Adapted from Shadow's RelocationUtil.groovy
// We want to relocate references to dependencies but not include the dependencies themselves in this jar.
// We also don't want to double-shade RFG classes
val prefix = "com.gtnewhorizons.retrofuturagradle.shadow"
val configurations = listOf(project.configurations.runtimeClasspath.get())

val packages = mutableSetOf<String>()

configurations.iterator().forEach { configuration ->
configuration.files.filter {
// we're already shading this in combinedShadowJar
f ->
f != project(":oldasmwrapper").tasks.named<Jar>("allJar").get().archiveFile.get().asFile
}.forEach { jar ->
JarFile(jar).use {
it.entries().iterator().forEach { entry ->
if (entry.name.endsWith(".class") && entry.name != "module-info.class") {
val pkg = entry.name.substring(0, entry.name.lastIndexOf('/') - 1).replace('/', '.')
if (!pkg.startsWith("com.gtnewhorizons.retrofuturagradle")) {
packages.add(pkg)
}
}
}
}
}
}
packages.iterator().forEach {
relocate(it, "${prefix}.${it}")
}
}
}

val combinedShadowJar = tasks.register<Jar>("combinedShadowJar") {
from("LICENSE", "docs", tasks.named("classes"))
val oldAsmJarTask = project(":oldasmwrapper").tasks.named<Jar>("allJar")
dependsOn(oldAsmJarTask)
from(zipTree(oldAsmJarTask.get().archiveFile)) // cheaper shadow of an already shaded jar

// dependencies are relocated in a separate task so the results can be reused
dependsOn(depsShadowJar)
from(zipTree(depsShadowJar.get().archiveFile))

dependsOn(mainShadowJar)
from(zipTree(mainShadowJar.get().archiveFile))

exclude("META-INF/gradle-plugins/de.*")
exclude("META-INF/versions/9/module-info.class")
exclude("META-INF/LICENSE")
exclude("META-INF/LICENSE*")
exclude("META-INF/NOTICE")
exclude("META-INF/NOTICE*")
exclude("META-INF/INDEX.LIST", "META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "module-info.class") // shadowJar defaults
}

tasks.jar.configure {
enabled = false
dependsOn(tasks.shadowJar)
dependsOn(combinedShadowJar)
}

configurations["functionalTestImplementation"].extendsFrom(configurations["testImplementation"])
Expand Down

0 comments on commit 283b7f9

Please sign in to comment.