Package net.fabricmc.loom.pipeline
Class GenerateForgePatchedJarTask
java.lang.Object
org.gradle.api.internal.AbstractTask
org.gradle.api.DefaultTask
net.fabricmc.loom.pipeline.GenerateForgePatchedJarTask
- All Implemented Interfaces:
Comparable<org.gradle.api.Task>,org.gradle.api.internal.DynamicObjectAware,org.gradle.api.internal.TaskInternal,org.gradle.api.Named,org.gradle.api.plugins.ExtensionAware,org.gradle.api.Task,org.gradle.util.Configurable<org.gradle.api.Task>
@CacheableTask
public abstract class GenerateForgePatchedJarTask
extends org.gradle.api.DefaultTask
L3 流水线:生产 modern Forge 的最终 patched jar(与 client-extra).
它取代的是 MinecraftPatchedProvider.remapJar 里那段配置期同步执行的
「判断是否需要重建 → 取跨进程锁 → 重映射 patched jar / 填充 client-extra → 原子落位」。
| 旧路径 | 本任务 | |
|---|---|---|
| 是否需要重建 | 配置期 provide() 设的 dirty + 锁内二次确认 |
Gradle up-to-date 检查(输入内容 + 输出快照)+ 锁内按可复用性二次确认 |
| 并发保护 | 跨进程文件锁 | 任务图 + 跨进程文件锁(产物仍在共享缓存) |
| 执行时机 | 配置期(CompileConfiguration.setupMinecraft) | 执行期 |
生产逻辑不在这里
真正的生产仍由MinecraftPatchedProvider.produceFinalJarsForTask(dev.architectury.loom.forge.minecraft.MinecraftPatchedProvider.ProductionOptions, java.nio.file.Path, java.nio.file.Path, java.nio.file.Path, java.lang.String, boolean, java.util.function.Consumer<java.lang.String>) 持有:它和配置期路径共用
同一份实现(remapFinalJar / fillClientExtraJar),因此两条路径的产物逐字节一致。
本任务另写一套「等价」的实现就会引入分叉——同一个输入产出两份略有差异的 jar,正是这次迁移要消灭的东西。
与 GenerateSrgNamedMappingsTask 处置一致:同一份实现被两条路径共用。
为什么输出是共享缓存里的那两个绝对路径
产物位置必须与配置期逐字一致(<userCache>/<mcVersion>/forge/minecraft-<type>-patched.jar
与 client-extra.jar):消费侧(getMinecraftJars()/
getMinecraftJarsCollection(OFFICIAL)、FORGE_EXTRA 配置的依赖项)按路径找它们。
该目录跨项目、跨 daemon 共享,因此「同一个路径只有一个生产者」由
RemapMinecraftTaskRegistry 在同一构建内保证,跨构建由 @OutputFile 的 up-to-date 判定
与产物自身的原子落位承担。
输入为什么是这些
输入逐项对应生产时真正读入的文件与判据,而不是「把 provider 的对象搬进来」:getAtPatchedJar():重映射的输入(打过补丁并做过 AT 的中间 jar);getForgeJar():参与重映射的类解析,并作为产物里的非 class 文件来源;getForgeUserdevJar():inject/下的文件会被复制进产物;getClientJar():client-extra 的非 class 文件来源;getServerJar():NeoForge 的 dist 清单要按它分边(bootstrap 版本是抽取产物, 否则是下载下来的 server jar);getMappingsServiceOptions():上述重映射、coremod 重映射与 dist 清单都从它取映射树, 与配置期buildRemapper/remapCoreMods用的是同一个映射选项;getPatchVersion():写在产物 manifest 里的补丁版本,也是配置期路径的就绪判据。
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.gradle.api.Named
org.gradle.api.Named.Namer -
Field Summary
FieldsFields inherited from interface org.gradle.api.Task
TASK_ACTION, TASK_CONSTRUCTOR_ARGS, TASK_DEPENDS_ON, TASK_DESCRIPTION, TASK_GROUP, TASK_NAME, TASK_OVERWRITE, TASK_TYPE -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidgenerate()abstract org.gradle.api.file.RegularFileProperty打补丁并做过 access transform 的中间 Minecraft jar,即重映射的输入.abstract org.gradle.api.provider.Property<Boolean> 本配置是否产出 client-extra(与配置期providesClientJar()同判据).abstract org.gradle.api.file.RegularFileProperty产物:client-extra(与配置期同一条路径);不产出时为未设置.abstract org.gradle.api.file.RegularFilePropertyclient jar(client-extra 的内容来源);server-only 配置下不设置.abstract org.gradle.api.provider.Property<String> coremod 重映射使用的源命名空间(生产命名空间).abstract org.gradle.api.provider.Property<String> 写进 dist 清单的Minecraft-Dists取值.abstract org.gradle.api.provider.Property<Boolean> getForge()是否 Forge(决定 client-extra 是否写空 MANIFEST).abstract org.gradle.api.file.RegularFilePropertyForge 的 universal jar.abstract org.gradle.api.file.RegularFilePropertyForge 的 userdev jar.abstract org.gradle.api.provider.Property<String> 跨进程锁的 key:与配置期withPatchedLock取同一个 key,两侧的生产才不会互相穿插.abstract org.gradle.api.provider.Property<String> 跨进程锁所在目录.abstract org.gradle.api.provider.Property<TinyMappingsService.Options> 映射服务配置:产出 jar 的重映射、coremod 重映射与 dist 清单都读它.abstract org.gradle.api.provider.Property<Boolean> 是否 MERGED 形态(决定 dist 清单是否按 client/server 分边).abstract org.gradle.api.provider.Property<Boolean> 是否 NeoForge(决定是否挂 mixin 扩展、是否写 dist 清单).abstract org.gradle.api.file.RegularFileProperty产物:最终 patched jar(与配置期同一条路径).abstract org.gradle.api.provider.Property<String> Loom 补丁版本:写在产物 manifest 里,也是配置期路径的就绪判据.abstract org.gradle.api.provider.Property<Boolean> 是否显式要求刷新(对应--refresh-dependencies);与配置期refreshDeps同源.abstract org.gradle.api.provider.Property<String> 重映射的源命名空间(Forge 为srg、NeoForge 为mojang).abstract org.gradle.api.provider.Property<Boolean> 是否在运行时使用 mojang 映射(决定 coremod 重映射的方向).abstract org.gradle.api.file.RegularFileProperty服务端侧 jar;仅 MERGED 形态用于 NeoForge 的 dist 清单.abstract org.gradle.api.provider.Property<Boolean> 是否 unobfuscated Forge(最终 jar 走 userdev 合并分支、dist 清单用空映射树).Methods inherited from class org.gradle.api.DefaultTask
compareTo, configure, dependsOn, doFirst, doFirst, doFirst, doLast, doLast, doLast, finalizedBy, getActions, getAnt, getDependsOn, getDescription, getDestroyables, getDidWork, getEnabled, getExtensions, getFinalizedBy, getGroup, getInputs, getLocalState, getLogger, getLogging, getMustRunAfter, getName, getOutputs, getPath, getProject, getShouldRunAfter, getState, getTaskDependencies, getTemporaryDir, getTimeout, hasProperty, mustRunAfter, onlyIf, onlyIf, onlyIf, property, setActions, setDependsOn, setDescription, setDidWork, setEnabled, setFinalizedBy, setGroup, setMustRunAfter, setOnlyIf, setOnlyIf, setOnlyIf, setProperty, setShouldRunAfter, shouldRunAfter, usesServiceMethods inherited from class org.gradle.api.internal.AbstractTask
acceptServiceReferences, appendParallelSafeAction, doNotTrackState, doNotTrackStateIf, getAsDynamicObject, getIdentityPath, getImpliesSubProjects, getLifecycleDependencies, getOnlyIf, getReasonNotToTrackState, getReasonsNotToTrackState, getReasonTaskIsIncompatibleWithConfigurationCache, getRequiredServices, getServices, getSharedResources, getStandardOutputCapture, getTaskActions, getTaskIdentity, getTemporaryDirFactory, hasTaskActions, injectIntoNewInstance, isCompatibleWithConfigurationCache, isEnabled, isHasCustomActions, notCompatibleWithConfigurationCache, prependParallelSafeAction, restoreOnlyIf, restoreTaskActions, setImpliesSubProjectsMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.gradle.api.Task
doNotTrackState, notCompatibleWithConfigurationCache
-
Field Details
-
NAME
任务名:消费侧(本仓库的测试与诊断)按它引用产出任务.- See Also:
-
-
Constructor Details
-
GenerateForgePatchedJarTask
public GenerateForgePatchedJarTask()
-
-
Method Details
-
getAtPatchedJar
@InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getAtPatchedJar()打补丁并做过 access transform 的中间 Minecraft jar,即重映射的输入. -
getForgeJar
@InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getForgeJar()Forge 的 universal jar. -
getForgeUserdevJar
@InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getForgeUserdevJar()Forge 的 userdev jar. -
getClientJar
@InputFile @PathSensitive(NONE) @Optional public abstract org.gradle.api.file.RegularFileProperty getClientJar()client jar(client-extra 的内容来源);server-only 配置下不设置. -
getServerJar
@InputFile @PathSensitive(NONE) @Optional public abstract org.gradle.api.file.RegularFileProperty getServerJar()服务端侧 jar;仅 MERGED 形态用于 NeoForge 的 dist 清单. -
getMappingsServiceOptions
public abstract org.gradle.api.provider.Property<TinyMappingsService.Options> getMappingsServiceOptions()映射服务配置:产出 jar 的重映射、coremod 重映射与 dist 清单都读它. -
getClientExtraEnabled
本配置是否产出 client-extra(与配置期providesClientJar()同判据). -
getPatchVersion
Loom 补丁版本:写在产物 manifest 里,也是配置期路径的就绪判据. -
getNeoForge
是否 NeoForge(决定是否挂 mixin 扩展、是否写 dist 清单). -
getForge
是否 Forge(决定 client-extra 是否写空 MANIFEST). -
getUnobfuscatedForge
是否 unobfuscated Forge(最终 jar 走 userdev 合并分支、dist 清单用空映射树). -
getRuntimeMojang
是否在运行时使用 mojang 映射(决定 coremod 重映射的方向). -
getMerged
是否 MERGED 形态(决定 dist 清单是否按 client/server 分边). -
getRemapNamespace
重映射的源命名空间(Forge 为srg、NeoForge 为mojang). -
getCoreModNamespace
coremod 重映射使用的源命名空间(生产命名空间). -
getDistAttribute
写进 dist 清单的Minecraft-Dists取值. -
getRefreshDeps
是否显式要求刷新(对应--refresh-dependencies);与配置期refreshDeps同源. -
getLockKey
跨进程锁的 key:与配置期withPatchedLock取同一个 key,两侧的生产才不会互相穿插.是
@Input而不是@Internal:换了 MC/Forge 版本就是换了一份产物身份。 -
getLockRoot
跨进程锁所在目录.@Internal:它只决定「在哪里互斥」,不决定产物内容;把它算进指纹会让同一份产物 因为缓存目录搬家而重建。 -
getOutputJar
@OutputFile public abstract org.gradle.api.file.RegularFileProperty getOutputJar()产物:最终 patched jar(与配置期同一条路径). -
getClientExtraJar
@OutputFile @Optional public abstract org.gradle.api.file.RegularFileProperty getClientExtraJar()产物:client-extra(与配置期同一条路径);不产出时为未设置. -
generate
- Throws:
Exception
-