From 6f38d5f2e80c26c839c0de2e2c846c6a02fdf5b0 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 19 Dec 2023 05:46:35 -0800 Subject: [PATCH] Change how `include` disables transitive dependencies to allow platform dependencies to work (#838) * Change how `include` disables transitive dependencies to allow platform dependencies to work * style fix * Cleanup and add test * spotlessApply --------- Co-authored-by: modmuss50 --- .../configuration/LoomConfigurations.java | 3 +- .../test/integration/IncludedJarsTest.groovy | 58 +++++++++++++++++++ .../test/integration/MultiProjectTest.groovy | 2 +- .../projects/includedJars/build.gradle | 21 +++++++ .../projects/includedJars/settings.gradle | 1 + .../src/main/resources/fabric.mod.json | 9 +++ 6 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 src/test/groovy/net/fabricmc/loom/test/integration/IncludedJarsTest.groovy create mode 100644 src/test/resources/projects/includedJars/build.gradle create mode 100644 src/test/resources/projects/includedJars/settings.gradle create mode 100644 src/test/resources/projects/includedJars/src/main/resources/fabric.mod.json diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java b/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java index 9d7008f3..16d98b73 100644 --- a/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java @@ -81,7 +81,8 @@ public abstract class LoomConfigurations implements Runnable { registerNonTransitive(Constants.Configurations.LOADER_DEPENDENCIES, Role.RESOLVABLE); registerNonTransitive(Constants.Configurations.MINECRAFT, Role.NONE); - registerNonTransitive(Constants.Configurations.INCLUDE, Role.RESOLVABLE); + // We don't need to make this non-transitive due to the way we resolve it. Also, doing so would break platform dependencies. + register(Constants.Configurations.INCLUDE, Role.RESOLVABLE); registerNonTransitive(Constants.Configurations.MAPPING_CONSTANTS, Role.RESOLVABLE); register(Constants.Configurations.NAMED_ELEMENTS, Role.CONSUMABLE).configure(configuration -> { diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/IncludedJarsTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/IncludedJarsTest.groovy new file mode 100644 index 00000000..457b61f8 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/test/integration/IncludedJarsTest.groovy @@ -0,0 +1,58 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2023 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.test.integration + +import spock.lang.Specification +import spock.lang.Unroll + +import net.fabricmc.loom.test.util.GradleProjectTestTrait + +import static net.fabricmc.loom.test.LoomTestConstants.STANDARD_TEST_VERSIONS +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class IncludedJarsTest extends Specification implements GradleProjectTestTrait { + @Unroll + def "included jars (gradle #version)"() { + setup: + def gradle = gradleProject(project: "includedJars", version: version) + + when: + def result = gradle.run(tasks: ["remapJar"]) + + then: + result.task(":remapJar").outcome == SUCCESS + + // Assert directly declared dependencies are present + gradle.hasOutputZipEntry("includedJars.jar", "META-INF/jars/log4j-core-2.22.0.jar") + gradle.hasOutputZipEntry("includedJars.jar", "META-INF/jars/adventure-text-serializer-gson-4.14.0.jar") + + // But not transitives. + !gradle.hasOutputZipEntry("includedJars.jar", "META-INF/jars/log4j-api-2.22.0.jar") + !gradle.hasOutputZipEntry("includedJars.jar", "META-INF/jars/adventure-api-4.14.0.jar") + + where: + version << STANDARD_TEST_VERSIONS + } +} diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/MultiProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/MultiProjectTest.groovy index da866213..c5669df0 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/MultiProjectTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/MultiProjectTest.groovy @@ -53,7 +53,7 @@ class MultiProjectTest extends Specification implements GradleProjectTestTrait { gradle.hasOutputZipEntry("multiproject-1.0.0.jar", "META-INF/jars/example-1.0.0.jar") gradle.hasOutputZipEntry("multiproject-1.0.0.jar", "META-INF/jars/core-1.0.0.jar") - gradle.hasOutputZipEntry("multiproject-1.0.0.jar", "META-INF/jars/fabric-api-base-0.2.1+9354966b7d.jar") + gradle.hasOutputZipEntry("multiproject-1.0.0.jar", "META-INF/jars/fabric-api-base-0.3.0+f74f7c7d7d.jar") where: version << STANDARD_TEST_VERSIONS diff --git a/src/test/resources/projects/includedJars/build.gradle b/src/test/resources/projects/includedJars/build.gradle new file mode 100644 index 00000000..5808e9a5 --- /dev/null +++ b/src/test/resources/projects/includedJars/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'fabric-loom' +} + +repositories { + mavenCentral() +} + +dependencies { + minecraft 'com.mojang:minecraft:1.18.2' + mappings 'net.fabricmc:yarn:1.18.2+build.1:v2' + modImplementation 'net.fabricmc:fabric-loader:0.13.3' + + include 'org.apache.logging.log4j:log4j-core:2.22.0' + + // Test bom/platform dependencies + include platform('net.kyori:adventure-bom:4.14.0') + + // bom provides version + include 'net.kyori:adventure-text-serializer-gson' +} diff --git a/src/test/resources/projects/includedJars/settings.gradle b/src/test/resources/projects/includedJars/settings.gradle new file mode 100644 index 00000000..7fdfcf73 --- /dev/null +++ b/src/test/resources/projects/includedJars/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'includedJars' diff --git a/src/test/resources/projects/includedJars/src/main/resources/fabric.mod.json b/src/test/resources/projects/includedJars/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..33bad8c2 --- /dev/null +++ b/src/test/resources/projects/includedJars/src/main/resources/fabric.mod.json @@ -0,0 +1,9 @@ +{ + "schemaVersion": 1, + "id": "modid", + "version": "0.0.0", + + "name": "Example Mod", + "description": "This is an example description! Tell everyone what your mod is about!", + "environment": "*" +}