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)→ 原子落位」。

旧路径 vs 本任务
旧路径本任务
是否需要生产配置期 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

    Fields
    Modifier and Type
    Field
    Description
    static final String
    分支:跑 MCP 的 rename 步(现代 Forge / NeoForge 的常规形态).
    static final String
    分支:跑 MCP 的 merge / preProcessJar 步(disableObfuscation / unobfuscated 形态).
    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
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
     
    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 / BRANCH_MCP_UNOBFUSCATED);其余分支下不设置.
    abstract org.gradle.api.file.DirectoryProperty
    MCP 执行链的工作目录.
    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, usesService

    Methods 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, setImpliesSubProjects

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.gradle.api.Task

    doNotTrackState, notCompatibleWithConfigurationCache
  • Field Details

    • NAME

      public static final String NAME
      任务名:消费侧(本仓库的测试与诊断)按它引用产出任务.
      See Also:
    • BRANCH_MCP_RENAME

      public static final String BRANCH_MCP_RENAME
      分支:跑 MCP 的 rename 步(现代 Forge / NeoForge 的常规形态).
      See Also:
    • BRANCH_MCP_UNOBFUSCATED

      public static final String BRANCH_MCP_UNOBFUSCATED
      分支:跑 MCP 的 merge / preProcessJar 步(disableObfuscation / unobfuscated 形态).

      与 BRANCH_MCP_RENAME 共用同一个 McpExecutor 实现与同一条落位路径, 唯一区别是排队哪一步:配置期的 createUnobfuscatedPrePatchJar 排的是 isNeoForge() ? "preProcessJar" : "merge"(1.7-1.16 的 FG2 形态另有实现,不走这里)。 步进集合因此仍只有一处定义,两条路径不会分叉。

      See Also:
    • BRANCH_NEOFORGE_INSTALLER_TOOLS

      public static final String BRANCH_NEOFORGE_INSTALLER_TOOLS
      分支:NeoForge installer tools 的 PROCESS_MINECRAFT_JAR(见 NeoForge#2848 的绕行).
      See Also:
  • Constructor Details

    • GenerateForgePrePatchJarTask

      public GenerateForgePrePatchJarTask()
  • Method Details

    • getBranch

      @Input public abstract org.gradle.api.provider.Property<String> getBranch()
      本次走哪条分支(配置期算好的纯值).
    • getMcpOptions

      @Optional public abstract org.gradle.api.provider.Property<McpExecutor.Options> getMcpOptions()
      MCP 执行器选项(BRANCH_MCP_RENAME / BRANCH_MCP_UNOBFUSCATED);其余分支下不设置.
    • getInstallerTools

      @Optional public abstract org.gradle.api.provider.Property<ForgeExternalToolService.Options> getInstallerTools()
      NeoForge installer tools 的声明式选项(BRANCH_NEOFORGE_INSTALLER_TOOLS);另一条分支下不设置.
    • getClientMappingsUrl

      @Input @Optional public abstract org.gradle.api.provider.Property<String> getClientMappingsUrl()
      installer tools 分支要下载的 client 映射地址;另一条分支下不设置.
    • getOffline

      @Input public abstract org.gradle.api.provider.Property<Boolean> getOffline()
      是否处于 Gradle 的离线模式(与配置期 extension.download 同判据).
    • getManualRefreshDeps

      @Input public abstract org.gradle.api.provider.Property<Boolean> 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

      public void generate() throws Exception
      Throws:
      Exception