correctly add mod dependencies to publications

This commit is contained in:
moehreag 2024-07-02 19:40:33 +02:00
parent f7ea37bf1a
commit 392b9628fe
3 changed files with 83 additions and 51 deletions

View file

@ -0,0 +1,70 @@
package dev.frogmc.phytotelma
import org.gradle.api.plugins.JavaPlugin
object ModConfigurations {
val configurations = listOf(
ModConfiguration(
JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, listOf(
JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME
), DependencyType.RUNTIME
),
ModConfiguration(
JavaPlugin.TEST_IMPLEMENTATION_CONFIGURATION_NAME, listOf(
JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME
), DependencyType.RUNTIME
),
ModConfiguration(
JavaPlugin.API_CONFIGURATION_NAME, listOf(
JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME
), DependencyType.COMPILE
),
ModConfiguration(
JavaPlugin.COMPILE_ONLY_API_CONFIGURATION_NAME, listOf(
JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME
), DependencyType.COMPILE
),
ModConfiguration(
JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME, listOf(
JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME
)
),
ModConfiguration(
JavaPlugin.TEST_COMPILE_ONLY_CONFIGURATION_NAME, listOf(
JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME
)
),
ModConfiguration(
JavaPlugin.RUNTIME_ONLY_CONFIGURATION_NAME, listOf(
JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME,
JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME,
)
),
ModConfiguration(
JavaPlugin.TEST_RUNTIME_ONLY_CONFIGURATION_NAME, listOf(
JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME,
)
)
)
}
data class ModConfiguration(
val name: String,
val classpathNames: List<String>,
val dependencyType: DependencyType = DependencyType.NONE,
)
enum class DependencyType {
NONE,
RUNTIME,
COMPILE
}

View file

@ -2,14 +2,9 @@ package dev.frogmc.phytotelma
import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtension import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtension
import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtensionImpl import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtensionImpl
import groovy.util.Node
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.artifacts.ExcludeRule
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
import org.gradle.configurationcache.extensions.capitalized import org.gradle.configurationcache.extensions.capitalized
import java.net.URI import java.net.URI
import java.nio.file.Path import java.nio.file.Path
@ -62,39 +57,18 @@ class PhytotelmaPlugin : Plugin<Project> {
PhytotelmaGradleExtensionImpl::class.java PhytotelmaGradleExtensionImpl::class.java
) )
remappedConfigurationNames.forEach { conf -> ModConfigurations.configurations.forEach { conf ->
project.configurations.create("mod" + conf.key.capitalized()) { c -> project.configurations.create("mod" + conf.name.capitalized()) { c ->
c.isCanBeResolved = true c.isCanBeResolved = true
c.isCanBeConsumed = false c.isCanBeConsumed = false
project.configurations.getByName(conf.key).extendsFrom(c) when (conf.dependencyType) {
DependencyType.RUNTIME -> project.configurations.getByName(JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME).extendsFrom(c)
DependencyType.COMPILE -> project.configurations.getByName(JavaPlugin.API_ELEMENTS_CONFIGURATION_NAME).extendsFrom(c)
DependencyType.NONE -> {}
} }
} }
project.tasks.filterIsInstance<PublishToMavenRepository>()
.forEach {
it.actions.addFirst {
} }
}
/*project.extensions.findByType(PublishingExtension::class.java)
.takeIf { it != null }.let { it!! }
.publications.filterIsInstance<MavenPublication>().forEach { p ->
p.pom {
it.withXml {
val project = it.asNode().get("project") as Node
val dependencies = project.get("dependencies") as Node
dependencies.appendNode("dependency")
.setValue(
"<groupId>dev.frogmc</groupId>\n" +
"<artifactId>thyroxine</artifactId>\n" +
"<version>0.0.1-alpha.6</version>\n" +
"<scope>runtime</scope>"
)
}
}
}*/
project.configurations.register(Constants.INCLUDE_CONFIGURATION) { project.configurations.register(Constants.INCLUDE_CONFIGURATION) {
it.isCanBeResolved = true it.isCanBeResolved = true

View file

@ -2,10 +2,7 @@ package dev.frogmc.phytotelma.ext
import com.electronwill.nightconfig.core.file.FileNotFoundAction import com.electronwill.nightconfig.core.file.FileNotFoundAction
import com.electronwill.nightconfig.toml.TomlParser import com.electronwill.nightconfig.toml.TomlParser
import dev.frogmc.phytotelma.Constants import dev.frogmc.phytotelma.*
import dev.frogmc.phytotelma.PhytotelmaPlugin
import dev.frogmc.phytotelma.ProjectStorage
import dev.frogmc.phytotelma.VersionChecker
import dev.frogmc.phytotelma.accesswidener.AccessWidener import dev.frogmc.phytotelma.accesswidener.AccessWidener
import dev.frogmc.phytotelma.build.PhytotelmaBuildTask import dev.frogmc.phytotelma.build.PhytotelmaBuildTask
import dev.frogmc.phytotelma.common.Env import dev.frogmc.phytotelma.common.Env
@ -24,7 +21,6 @@ import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory import org.gradle.api.model.ObjectFactory
import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import org.gradle.configurationcache.extensions.capitalized import org.gradle.configurationcache.extensions.capitalized
import org.jetbrains.java.decompiler.main.Fernflower import org.jetbrains.java.decompiler.main.Fernflower
import org.jetbrains.java.decompiler.main.decompiler.PrintStreamLogger import org.jetbrains.java.decompiler.main.decompiler.PrintStreamLogger
@ -203,15 +199,15 @@ abstract class PhytotelmaGradleExtensionImpl @Inject constructor(
} }
private fun remapModDependencies() { private fun remapModDependencies() {
PhytotelmaPlugin.remappedConfigurationNames.forEach { conf -> ModConfigurations.configurations.forEach { conf ->
val artifacts = project.configurations.getByName("mod" + conf.key.capitalized()) val artifacts = project.configurations.getByName("mod" + conf.name.capitalized())
.resolvedConfiguration.resolvedArtifacts .resolvedConfiguration.resolvedArtifacts
if (artifacts.isEmpty()) { if (artifacts.isEmpty()) {
return return
} }
val target = project.configurations.create("mod" + conf.key.capitalized()+"Mapped") { c -> val target = project.configurations.create("mod" + conf.name.capitalized()+"Mapped") { c ->
c.isTransitive = false // TODO while this configuration should not be transitive, the original dependency should be! c.isTransitive = false
conf.value.forEach { conf.classpathNames.forEach {
project.configurations.getByName(it).extendsFrom(c) project.configurations.getByName(it).extendsFrom(c)
} }
} }
@ -226,28 +222,21 @@ abstract class PhytotelmaGradleExtensionImpl @Inject constructor(
.resolve("dev/frogmc/phytotelma/remapped_mods") .resolve("dev/frogmc/phytotelma/remapped_mods")
val remappedPaths = mutableListOf<Path>() val remappedPaths = mutableListOf<Path>()
artifacts.forEach { artifact -> artifacts.forEach { artifact ->
println(artifact.file)
val id = artifact.id.componentIdentifier.toString().split(":")
val group = artifact.moduleVersion.id.group val group = artifact.moduleVersion.id.group
val name = artifact.moduleVersion.id.name val name = artifact.moduleVersion.id.name
val groupname = (group + "_" + name).replace(".", "_") val groupname = (group + "_" + name).replace(".", "_")
val version = artifact.moduleVersion.id.version val version = artifact.moduleVersion.id.version
val classifier = artifact.classifier val classifier = artifact.classifier
val remappedPath = targetPath.resolve(groupname).resolve(version).resolve(artifact.file.name) val remappedPath = targetPath.resolve(groupname).resolve(version).resolve(artifact.file.name)
/*val remappedPath = targetPath.resolve(group.replace(".", "/"))
.resolve(name).resolve(version).resolve(artifact.file.name)*/
remappedPath.createParentDirectories() remappedPath.createParentDirectories()
remappedPaths.add(remappedPath) remappedPaths.add(remappedPath)
val pom = remappedPath.resolveSibling(artifact.file.name.removeSuffix(".jar")+".pom") val pom = remappedPath.resolveSibling(artifact.file.name.removeSuffix(".jar")+".pom")
//val pom = remappedPath.resolveSibling(artifact.file.name.substring(0, artifact.file.name.lastIndexOf("."))+".pom")
pom.writeText( pom.writeText(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" + "<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +
"\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + "\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
"\t<modelVersion>4.0.0</modelVersion>\n" + "\t<modelVersion>4.0.0</modelVersion>\n" +
//"\t<groupId>$group</groupId>\n" +
//"\t<artifactId>$name</artifactId>\n" +
"\t<groupId>dev.frogmc.phytotelma.remapped_mods</groupId>\n" + "\t<groupId>dev.frogmc.phytotelma.remapped_mods</groupId>\n" +
"\t<artifactId>$groupname</artifactId>\n" + "\t<artifactId>$groupname</artifactId>\n" +
"\t<version>$version</version>\n" + "\t<version>$version</version>\n" +
@ -257,7 +246,6 @@ abstract class PhytotelmaGradleExtensionImpl @Inject constructor(
Thyroxine.remap(mappings, artifact.file.toPath(), remappedPath, false, false) Thyroxine.remap(mappings, artifact.file.toPath(), remappedPath, false, false)
//project.dependencies.add(conf.key, group+":"+name+":"+version+(classifier?:""))
project.dependencies.add(target.name, "dev.frogmc.phytotelma.remapped_mods:$groupname:$version"+(classifier?.let { ":$it" }?:"")) project.dependencies.add(target.name, "dev.frogmc.phytotelma.remapped_mods:$groupname:$version"+(classifier?.let { ":$it" }?:""))
} }
} }