Class ExportLoomProjectDataTask

java.lang.Object
org.gradle.api.internal.AbstractTask
org.gradle.api.DefaultTask
net.fabricmc.loom.task.ExportLoomProjectDataTask
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 ExportLoomProjectDataTask extends org.gradle.api.DefaultTask
把当前项目的 LoomProjectData 导出为文件,供其它项目在内存共享表里查不到时回退读取.

输出通过 loomProjectDataElements 可消费配置暴露:消费方可以解析该配置(触发本任务), 也可以直接读文件,所以它必须随项目身份与内容一起失效。本类保留 CacheableTask, 并把 LoomProjectData.fromProject(org.gradle.api.Project) 的**完整结果**登记为唯一输入, 原因有三点:

  • 不声明输入时,Gradle 只按「输出是否存在」判定 UP-TO-DATE:改了 mod 元数据或映射标识之后文件不刷新, 日常被内存共享表掩盖,只在回退路径与外部消费方那里暴露成过期数据;
  • 构建缓存键里没有项目身份时,多个项目(甚至不同项目路径的工作副本)会算出同一个键, 共享缓存可能把别的项目的 project-data.json 还原到本项目;
  • DTO 里的每个 mod 还带着 resources(mixin 配置、AT/AW、javadoc、原始元数据文件的**字节内容**), 依赖方靠它重建模组视图。早期只把 JSON 字符串登记成输入,这些字节变化不会让本任务失效, 构建缓存可能还原出「JSON 是新的、资源是旧的」的错配数据。

执行期不得访问 Project:整个 DTO 在配置期由 getProjectData() 的 convention 求值并序列化,exportProjectData() 只做写文件。 早期的实现在 @TaskAction 里调用 fromProject(getProject()),开启配置缓存后 会抛 InvalidUserCodeException——本任务曾因此完全无法在配置缓存下运行。

  • Nested Class Summary

    Nested classes/interfaces inherited from interface org.gradle.api.Named

    org.gradle.api.Named.Namer
  • Field Summary

    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.file.RegularFileProperty
     
    abstract org.gradle.api.provider.Property<LoomProjectData>
    要导出的跨项目数据,作为唯一输入参与指纹与构建缓存键.

    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
  • Constructor Details

    • ExportLoomProjectDataTask

      public ExportLoomProjectDataTask()
  • Method Details

    • getProjectData

      @Input public abstract org.gradle.api.provider.Property<LoomProjectData> getProjectData()
      要导出的跨项目数据,作为唯一输入参与指纹与构建缓存键.

      直接登记 LoomProjectData(而非拆成若干字符串):它实现了 Serializable, 既能让配置缓存正确存取,也能让缓存键覆盖 mod 资源字节,避免「JSON 新、资源旧」的错配。 项目身份(projectPath)本来就在 DTO 里,因此不必再单独声明输入。

    • getOutputFile

      @OutputFile public abstract org.gradle.api.file.RegularFileProperty getOutputFile()
    • exportProjectData

      public void exportProjectData() throws IOException
      Throws:
      IOException