2019-08-26 04:45:03 +00:00
|
|
|
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
2021-05-14 21:42:37 +00:00
|
|
|
import org.gradle.api.Plugin
|
2019-08-26 04:45:03 +00:00
|
|
|
import org.gradle.api.Project
|
2020-08-14 19:29:15 +00:00
|
|
|
import org.gradle.api.artifacts.ExternalModuleDependency
|
2019-08-26 04:45:03 +00:00
|
|
|
import org.gradle.api.artifacts.ModuleDependency
|
2021-05-14 21:42:37 +00:00
|
|
|
import org.gradle.api.attributes.Bundling
|
|
|
|
import org.gradle.api.attributes.Category
|
|
|
|
import org.gradle.api.attributes.DocsType
|
|
|
|
import org.gradle.api.attributes.LibraryElements
|
|
|
|
import org.gradle.api.attributes.Usage
|
|
|
|
import org.gradle.api.attributes.java.TargetJvmVersion
|
|
|
|
import org.gradle.api.component.AdhocComponentWithVariants
|
|
|
|
import org.gradle.api.component.SoftwareComponentFactory
|
|
|
|
import org.gradle.api.publish.PublishingExtension
|
|
|
|
import org.gradle.api.publish.maven.MavenPublication
|
2019-08-26 04:45:03 +00:00
|
|
|
import org.gradle.api.tasks.bundling.Jar
|
|
|
|
import org.gradle.kotlin.dsl.apply
|
2021-05-14 21:42:37 +00:00
|
|
|
import org.gradle.kotlin.dsl.configure
|
2019-08-26 04:45:03 +00:00
|
|
|
import org.gradle.kotlin.dsl.get
|
|
|
|
import org.gradle.kotlin.dsl.invoke
|
2021-05-14 21:42:37 +00:00
|
|
|
import org.gradle.kotlin.dsl.named
|
2021-09-19 20:50:34 +00:00
|
|
|
import org.gradle.kotlin.dsl.provideDelegate
|
2019-08-26 04:45:03 +00:00
|
|
|
import org.gradle.kotlin.dsl.register
|
2021-05-14 21:42:37 +00:00
|
|
|
import javax.inject.Inject
|
2019-08-26 04:45:03 +00:00
|
|
|
|
|
|
|
fun Project.applyLibrariesConfiguration() {
|
|
|
|
applyCommonConfiguration()
|
|
|
|
apply(plugin = "java-base")
|
2021-01-18 20:58:50 +00:00
|
|
|
apply(plugin = "maven-publish")
|
2019-08-26 04:45:03 +00:00
|
|
|
apply(plugin = "com.github.johnrengelman.shadow")
|
|
|
|
|
|
|
|
configurations {
|
|
|
|
create("shade")
|
|
|
|
}
|
|
|
|
|
|
|
|
group = "${rootProject.group}.worldedit-libs"
|
|
|
|
|
2020-11-09 09:38:10 +00:00
|
|
|
val relocations = mapOf(
|
2021-05-14 21:42:37 +00:00
|
|
|
"net.kyori.text" to "com.sk89q.worldedit.util.formatting.text",
|
|
|
|
"net.kyori.minecraft" to "com.sk89q.worldedit.util.kyori",
|
2021-07-01 20:16:25 +00:00
|
|
|
"net.kyori.adventure.nbt" to "com.sk89q.worldedit.util.nbt"
|
|
|
|
|
2020-11-09 09:38:10 +00:00
|
|
|
)
|
|
|
|
|
2019-08-26 04:45:03 +00:00
|
|
|
tasks.register<ShadowJar>("jar") {
|
|
|
|
configurations = listOf(project.configurations["shade"])
|
|
|
|
archiveClassifier.set("")
|
|
|
|
|
|
|
|
dependencies {
|
|
|
|
exclude(dependency("com.google.guava:guava"))
|
|
|
|
exclude(dependency("com.google.code.gson:gson"))
|
|
|
|
exclude(dependency("org.checkerframework:checker-qual"))
|
2021-03-29 13:29:16 +00:00
|
|
|
exclude(dependency("org.apache.logging.log4j:log4j-api"))
|
2021-08-01 17:28:51 +00:00
|
|
|
exclude(dependency("com.google.code.findbugs:jsr305"))
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
|
|
|
|
2020-11-09 09:38:10 +00:00
|
|
|
relocations.forEach { (from, to) ->
|
|
|
|
relocate(from, to)
|
|
|
|
}
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
|
|
|
val altConfigFiles = { artifactType: String ->
|
|
|
|
val deps = configurations["shade"].incoming.dependencies
|
2021-05-14 21:42:37 +00:00
|
|
|
.filterIsInstance<ModuleDependency>()
|
|
|
|
.map { it.copy() }
|
|
|
|
.map { dependency ->
|
|
|
|
dependency.artifact {
|
|
|
|
name = dependency.name
|
|
|
|
type = artifactType
|
|
|
|
extension = "jar"
|
|
|
|
classifier = artifactType
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
2021-05-14 21:42:37 +00:00
|
|
|
dependency
|
|
|
|
}
|
2019-08-26 04:45:03 +00:00
|
|
|
|
|
|
|
files(configurations.detachedConfiguration(*deps.toTypedArray())
|
2021-05-14 21:42:37 +00:00
|
|
|
.resolvedConfiguration.lenientConfiguration.artifacts
|
|
|
|
.filter { it.classifier == artifactType }
|
|
|
|
.map { zipTree(it.file) })
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
|
|
|
tasks.register<Jar>("sourcesJar") {
|
|
|
|
from({
|
|
|
|
altConfigFiles("sources")
|
|
|
|
})
|
2020-11-09 09:38:10 +00:00
|
|
|
relocations.forEach { (from, to) ->
|
|
|
|
val filePattern = Regex("(.*)${from.replace('.', '/')}((?:/|$).*)")
|
|
|
|
val textPattern = Regex.fromLiteral(from)
|
|
|
|
eachFile {
|
|
|
|
filter {
|
|
|
|
it.replaceFirst(textPattern, to)
|
|
|
|
}
|
|
|
|
path = path.replaceFirst(filePattern, "$1${to.replace('.', '/')}$2")
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
archiveClassifier.set("sources")
|
|
|
|
}
|
|
|
|
|
|
|
|
tasks.named("assemble").configure {
|
|
|
|
dependsOn("jar", "sourcesJar")
|
|
|
|
}
|
|
|
|
|
2021-05-14 21:42:37 +00:00
|
|
|
project.apply<LibsConfigPluginHack>()
|
|
|
|
|
|
|
|
val libsComponent = project.components["libs"] as AdhocComponentWithVariants
|
|
|
|
|
|
|
|
val apiElements = project.configurations.register("apiElements") {
|
|
|
|
isVisible = false
|
|
|
|
description = "API elements for libs"
|
|
|
|
isCanBeResolved = false
|
|
|
|
isCanBeConsumed = true
|
|
|
|
attributes {
|
|
|
|
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_API))
|
|
|
|
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
|
|
|
|
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
|
|
|
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR))
|
|
|
|
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11)
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
2021-05-14 21:42:37 +00:00
|
|
|
outgoing.artifact(tasks.named("jar"))
|
|
|
|
}
|
|
|
|
|
|
|
|
val runtimeElements = project.configurations.register("runtimeElements") {
|
|
|
|
isVisible = false
|
|
|
|
description = "Runtime elements for libs"
|
|
|
|
isCanBeResolved = false
|
|
|
|
isCanBeConsumed = true
|
|
|
|
attributes {
|
|
|
|
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
|
|
|
|
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
|
|
|
|
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
|
|
|
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR))
|
|
|
|
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11)
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
2021-05-14 21:42:37 +00:00
|
|
|
outgoing.artifact(tasks.named("jar"))
|
|
|
|
}
|
|
|
|
|
|
|
|
val sourcesElements = project.configurations.register("sourcesElements") {
|
|
|
|
isVisible = false
|
|
|
|
description = "Source elements for libs"
|
|
|
|
isCanBeResolved = false
|
|
|
|
isCanBeConsumed = true
|
|
|
|
attributes {
|
|
|
|
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
|
|
|
|
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.DOCUMENTATION))
|
|
|
|
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
|
|
|
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType.SOURCES))
|
|
|
|
}
|
|
|
|
outgoing.artifact(tasks.named("sourcesJar"))
|
|
|
|
}
|
|
|
|
|
|
|
|
libsComponent.addVariantsFromConfiguration(apiElements.get()) {
|
|
|
|
mapToMavenScope("compile")
|
|
|
|
}
|
|
|
|
|
|
|
|
libsComponent.addVariantsFromConfiguration(runtimeElements.get()) {
|
|
|
|
mapToMavenScope("runtime")
|
|
|
|
}
|
|
|
|
|
|
|
|
libsComponent.addVariantsFromConfiguration(sourcesElements.get()) {
|
|
|
|
mapToMavenScope("runtime")
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
|
|
|
|
2021-05-14 21:42:37 +00:00
|
|
|
configure<PublishingExtension> {
|
|
|
|
publications {
|
|
|
|
register<MavenPublication>("maven") {
|
|
|
|
from(libsComponent)
|
2021-09-19 20:50:34 +00:00
|
|
|
|
|
|
|
group = "com.fastasyncworldedit"
|
|
|
|
artifactId = "${rootProject.name}-Libs"
|
|
|
|
version = version
|
|
|
|
|
|
|
|
pom {
|
|
|
|
name.set("${rootProject.name}-Libs" + " " + project.version)
|
|
|
|
description.set("Blazingly fast Minecraft world manipulation for artists, builders and everyone else.")
|
|
|
|
url.set("https://github.com/IntellectualSites/FastAsyncWorldEdit")
|
|
|
|
|
|
|
|
licenses {
|
|
|
|
license {
|
|
|
|
name.set("GNU General Public License, Version 3.0")
|
|
|
|
url.set("https://www.gnu.org/licenses/gpl-3.0.html")
|
|
|
|
distribution.set("repo")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
developers {
|
|
|
|
developer {
|
|
|
|
id.set("NotMyFault")
|
|
|
|
name.set("NotMyFault")
|
|
|
|
email.set("contact@notmyfault.dev")
|
|
|
|
organization.set("IntellectualSites")
|
|
|
|
}
|
|
|
|
developer {
|
|
|
|
id.set("SirYwell")
|
|
|
|
name.set("Hannes Greule")
|
|
|
|
organization.set("IntellectualSites")
|
|
|
|
}
|
|
|
|
developer {
|
|
|
|
id.set("dordsor21")
|
|
|
|
name.set("dordsor21")
|
|
|
|
organization.set("IntellectualSites")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
scm {
|
|
|
|
url.set("https://github.com/IntellectualSites/FastAsyncWorldEdit")
|
|
|
|
connection.set("scm:https://IntellectualSites@github.com/IntellectualSites/FastAsyncWorldEdit.git")
|
|
|
|
developerConnection.set("scm:git://github.com/IntellectualSites/FastAsyncWorldEdit.git")
|
|
|
|
}
|
|
|
|
|
|
|
|
issueManagement {
|
|
|
|
system.set("GitHub")
|
|
|
|
url.set("https://github.com/IntellectualSites/FastAsyncWorldEdit/issues")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
repositories {
|
|
|
|
mavenLocal()
|
|
|
|
val nexusUsername: String? by project
|
|
|
|
val nexusPassword: String? by project
|
|
|
|
if (nexusUsername != null && nexusPassword != null) {
|
|
|
|
maven {
|
|
|
|
val releasesRepositoryUrl = "https://mvn.intellectualsites.com/content/repositories/releases/"
|
|
|
|
val snapshotRepositoryUrl = "https://mvn.intellectualsites.com/content/repositories/snapshots/"
|
|
|
|
/* Commenting this out for now - Fawe currently does not user semver or any sort of versioning that
|
|
|
|
differentiates between snapshots and releases, API & (past) deployment wise, this will come with a next major release.
|
|
|
|
url = uri(
|
|
|
|
if (version.toString().endsWith("-SNAPSHOT")) snapshotRepositoryUrl
|
|
|
|
else releasesRepositoryUrl
|
|
|
|
)
|
|
|
|
*/
|
|
|
|
url = uri(releasesRepositoryUrl)
|
|
|
|
|
|
|
|
credentials {
|
|
|
|
username = nexusUsername
|
|
|
|
password = nexusPassword
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
logger.warn("No nexus repository is added; nexusUsername or nexusPassword is null.")
|
2021-05-14 21:42:37 +00:00
|
|
|
}
|
2019-08-26 04:45:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2020-08-14 19:29:15 +00:00
|
|
|
|
2021-05-14 21:42:37 +00:00
|
|
|
// A horrible hack because `softwareComponentFactory` has to be gotten via plugin
|
|
|
|
// gradle why
|
|
|
|
internal open class LibsConfigPluginHack @Inject constructor(
|
|
|
|
private val softwareComponentFactory: SoftwareComponentFactory
|
|
|
|
) : Plugin<Project> {
|
|
|
|
override fun apply(project: Project) {
|
|
|
|
val libsComponents = softwareComponentFactory.adhoc("libs")
|
|
|
|
project.components.add(libsComponents)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-14 19:29:15 +00:00
|
|
|
fun Project.constrainDependenciesToLibsCore() {
|
|
|
|
evaluationDependsOn(":worldedit-libs:core")
|
|
|
|
val coreDeps = project(":worldedit-libs:core").configurations["shade"].dependencies
|
|
|
|
.filterIsInstance<ExternalModuleDependency>()
|
|
|
|
dependencies.constraints {
|
|
|
|
for (coreDep in coreDeps) {
|
|
|
|
add("shade", "${coreDep.group}:${coreDep.name}:${coreDep.version}") {
|
|
|
|
because("libs should align with libs:core")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|