MinecraftForge / ForgeGradle

Minecraft mod development framework used by Forge and FML for the gradle build system
GNU Lesser General Public License v2.1
517 stars 443 forks source link

Custom JarJar tasks cannot be registered after applying UserDevPlugin #893

Closed andriihorpenko closed 11 months ago

andriihorpenko commented 1 year ago

Introduction

I need to create two separate tasks of JarJar type. However, after a long investigation, I've found out that such custom tasks should be created (and disabled) before applying UserDevPlugin.

Examples

Let's take a look at two examples.

apply<UserDevPlugin>()

tasks.create<JarJar>("clientJarJar") {
    enabled = false
}

This won't compile as Gradle reports the following error:

Stacktrace ```java * Exception is: org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'net.mattermc.mod'] Caused by: org.gradle.api.internal.AbstractMutationGuard$IllegalMutationException: DefaultTaskContainer#create(String, Class) on task set cannot be executed in the current context. at org.gradle.api.internal.AbstractMutationGuard.createIllegalStateException(AbstractMutationGuard.java:39) at org.gradle.api.internal.AbstractMutationGuard.assertMutationAllowed(AbstractMutationGuard.java:27) at org.gradle.api.internal.DefaultDomainObjectCollection.assertMutable(DefaultDomainObjectCollection.java:458) at org.gradle.api.internal.tasks.DefaultTaskContainer.create(DefaultTaskContainer.java:277) at org.gradle.api.internal.tasks.DefaultTaskContainer.maybeCreate(DefaultTaskContainer.java:266) at org.gradle.api.internal.tasks.DefaultTaskContainer.maybeCreate(DefaultTaskContainer.java:75) at net.minecraftforge.gradle.userdev.UserDevPlugin.lambda$createReobfExtension$33(UserDevPlugin.java:348) at org.gradle.api.internal.FactoryNamedDomainObjectContainer.doCreate(FactoryNamedDomainObjectContainer.java:93) at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:78) at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:56) at net.minecraftforge.gradle.userdev.UserDevPlugin.lambda$apply$31(UserDevPlugin.java:338) at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123) at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction$1.run(DefaultCollectionCallbackActionDecorator.java:110) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68) at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction.execute(DefaultCollectionCallbackActionDecorator.java:107) at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:44) at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:44) at org.gradle.api.internal.collections.CollectionFilter$1.execute(CollectionFilter.java:59) at org.gradle.internal.ImmutableActionSet$SetWithManyActions.execute(ImmutableActionSet.java:329) at org.gradle.api.internal.DefaultDomainObjectCollection.doAdd(DefaultDomainObjectCollection.java:262) at org.gradle.api.internal.DefaultNamedDomainObjectCollection.doAdd(DefaultNamedDomainObjectCollection.java:113) at org.gradle.api.internal.DefaultDomainObjectCollection.add(DefaultDomainObjectCollection.java:251) at org.gradle.api.internal.tasks.DefaultTaskContainer.addInternal(DefaultTaskContainer.java:752) at org.gradle.api.internal.tasks.DefaultTaskContainer.addTask(DefaultTaskContainer.java:253) at org.gradle.api.internal.tasks.DefaultTaskContainer.access$400(DefaultTaskContainer.java:76) at org.gradle.api.internal.tasks.DefaultTaskContainer$2.call(DefaultTaskContainer.java:298) ... 199 more ```

We can observe that it fails with DefaultTaskContainer#create(String, Class) on task set cannot be executed in the current context. which points to reobfExtension's NamedDomainObjectContainer#create.


Now let's examine the following example.

tasks.create<JarJar>("clientJarJar") {
    enabled = false
}

apply<UserDevPlugin>()

This will work and build will succeed.

Conclusion

If I understand correctly, the build fails due to improper order of reobf task generation and configuration.

marchermans commented 1 year ago

Please report this on the forgegradle repo since that project manages that part.

This repo only provides the base libraries and specification.