Package net.fabricmc.loom.pipeline
Class GenerateForgePrePatchJarTask
java.lang.Object
org.gradle.api.internal.AbstractTask
org.gradle.api.DefaultTask
net.fabricmc.loom.pipeline.GenerateForgePrePatchJarTask
- 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 GenerateForgePrePatchJarTask
extends org.gradle.api.DefaultTask
L3 流水线:生产 Forge 的 pre-patch Minecraft jar(
minecraft-<type>-<ns>.jar).
它取代的是 MinecraftPatchedProvider.provide() 里那段配置期同步执行的
「取跨进程锁 → 判断是否需要重建 → 选分支 → 跑 MCP rename 步(或 NeoForge installer tools)→ 原子落位」。
| 旧路径 | 本任务 | |
|---|---|---|
| 是否需要生产 | 配置期 needsWork() 设的 dirty + 锁内二次确认 |
Gradle up-to-date 检查(输入内容 + 输出快照) |
| 并发保护 | 跨进程文件锁 | 任务图 + 跨进程文件锁(产物仍在共享缓存) |
| 执行时机 | 配置期(CompileConfiguration.setupMinecraft) | 执行期 |
生产逻辑不在这里
真正的生产仍由MinecraftPatchedProvider.runMcpExecutor(org.gradle.api.provider.Provider<dev.architectury.loom.mcpconfig.McpExecutor.Options>, java.nio.file.Path, net.fabricmc.loom.util.service.ServiceFactory) 与
ForgeExternalToolService.exec(java.util.Map<java.lang.String, java.lang.String>) 持有:配置期路径与本任务共用同一份实现,
因此两条路径的 MCP 步进集合、命令行与产物逐字节一致。本任务另写一套「等价」的实现就会引入分叉。
两条分支由配置期定死
getBranch() 是配置期算好的纯值(判据见
MinecraftPatchedProvider.shouldUseNeoForgeInstallerToolsToCreatePrePatchJar()),
执行期不再回读项目模型;两条分支各自的工具声明也只挂它自己那一个 @Nested 输入。
MCP 工作目录为什么是任务自己的
配置期路径用TempFiles 造一个随机临时目录,本次调用结束即删;任务路径必须让目录活到执行期,
因此改由 getMcpWorkDir() 给出(build/tmp/<任务名>/mcp),由本任务在执行期创建、
结束即删——对 MCP 执行链而言与配置期的 TempFiles 语义完全一致。
目录路径不参与产物内容(旧路径每次都是随机路径而产物不变),故它是 @Internal。-
Nested Class Summary
Nested classes/interfaces inherited from interface org.gradle.api.Named
org.gradle.api.Named.Namer -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final String分支:跑 MCP 的rename步(现代 Forge / NeoForge 的常规形态).static final String分支:NeoForge installer tools 的PROCESS_MINECRAFT_JAR(见 NeoForge#2848 的绕行).static final String任务名:消费侧(本仓库的测试与诊断)按它引用产出任务.Fields 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.provider.Property<String> 本次走哪条分支(配置期算好的纯值).abstract org.gradle.api.provider.Property<String> installer tools 分支要下载的 client 映射地址;另一条分支下不设置.abstract org.gradle.api.provider.Property<ForgeExternalToolService.Options> NeoForge installer tools 的声明式选项(BRANCH_NEOFORGE_INSTALLER_TOOLS);另一条分支下不设置.abstract org.gradle.api.provider.Property<Boolean> 是否显式要求刷新依赖(与配置期extension.download同判据).abstract org.gradle.api.provider.Property<McpExecutor.Options> MCP 执行器选项(BRANCH_MCP_RENAME);另一条分支下不设置.abstract org.gradle.api.file.DirectoryPropertyMCP 执行链的工作目录.abstract org.gradle.api.provider.Property<Boolean> 是否处于 Gradle 的离线模式(与配置期extension.download同判据).abstract org.gradle.api.file.RegularFileProperty产物:pre-patch jar(与配置期同一条路径).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:
-
BRANCH_MCP_RENAME
分支:跑 MCP 的rename步(现代 Forge / NeoForge 的常规形态).- See Also:
-
BRANCH_NEOFORGE_INSTALLER_TOOLS
分支:NeoForge installer tools 的PROCESS_MINECRAFT_JAR(见 NeoForge#2848 的绕行).- See Also:
-
-
Constructor Details
-
GenerateForgePrePatchJarTask
public GenerateForgePrePatchJarTask()
-
-
Method Details
-
getBranch
本次走哪条分支(配置期算好的纯值). -
getMcpOptions
MCP 执行器选项(BRANCH_MCP_RENAME);另一条分支下不设置. -
getInstallerTools
@Optional public abstract org.gradle.api.provider.Property<ForgeExternalToolService.Options> getInstallerTools()NeoForge installer tools 的声明式选项(BRANCH_NEOFORGE_INSTALLER_TOOLS);另一条分支下不设置. -
getClientMappingsUrl
installer tools 分支要下载的 client 映射地址;另一条分支下不设置. -
getOffline
是否处于 Gradle 的离线模式(与配置期extension.download同判据). -
getManualRefreshDeps
是否显式要求刷新依赖(与配置期extension.download同判据). -
getMcpWorkDir
@Internal public abstract org.gradle.api.file.DirectoryProperty getMcpWorkDir()MCP 执行链的工作目录.@Internal:它只决定中间文件放在哪里,不决定产物内容——配置期路径每次都用新的随机临时目录, 产物却逐字节相同(见类注释)。 -
getOutputJar
@OutputFile public abstract org.gradle.api.file.RegularFileProperty getOutputJar()产物:pre-patch jar(与配置期同一条路径). -
generate
- Throws:
Exception
-