Class LoomProjectData

java.lang.Object
net.fabricmc.loom.internal.LoomProjectData
All Implemented Interfaces:
Serializable

public final class LoomProjectData extends Object implements Serializable
跨项目传递的最小项目数据,只包含基础类型和可序列化集合.

相等性只由 projectPath() 决定。同一次构建里,同一个项目的数据可能来自内存共享表 (LoomGradleSharedData 中的既有实例)、直接读取依赖项目导出的 project-data.json (fromDependency(org.gradle.api.Project, org.gradle.api.artifacts.ProjectDependency))或两者的组合,内容相同但实例不同。消费方用 distinct() 与 contains 判断「是不是同一个依赖项目」,因此身份必须落在项目路径上; 否则文件回退路径会把同一个项目看成两个不同的项目,使交集为空(依赖项目的 mod 被静默丢弃) 或 distinct() 失效(同一个 mod 被处理两次)。

See Also:
  • Field Details

  • Constructor Details

  • Method Details

    • projectPath

      public String projectPath()
    • mods

      public List<LoomProjectData.ModData> mods()
    • mappingId

      public @Nullable String mappingId()
    • productionNamespace

      public @Nullable String productionNamespace()
    • splitEnvironmentSourceSets

      public boolean splitEnvironmentSourceSets()
    • mixinMappingFiles

      public List<String> mixinMappingFiles()
    • equals

      public boolean equals(@Nullable Object obj)
      相等性只看 projectPath():该数据是项目自身状态的投影,一个项目在一次构建里只对应一份数据, 不同来源(内存共享表、导出文件)得到的对象必须被视为同一个项目,见类注释.
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • createMods

      public List<FabricModJson> createMods()
    • fromProject

      public static LoomProjectData fromProject(org.gradle.api.Project project)
    • readProductionNamespace

      public static @Nullable String readProductionNamespace(org.gradle.api.Project project)
      读取生产命名空间,与 fromProject(Project) 打包进 DTO 的值同源.

      供 exportLoomProjectData 把它登记为任务输入;未配置时返回 null。

      Parameters:
      project - 目标项目
      Returns:
      生产命名空间名称,或 null 表示当前构建里还拿不到
    • readModJson

      public static List<String> readModJson(org.gradle.api.Project project)
      读取项目内全部 mod 的元数据 JSON,与 fromProject(Project) 写入 DTO 的 mod 列表同源.

      供 exportLoomProjectData 登记输入指纹:mod 元数据是导出内容的一部分, 它的变化必须让导出文件失效。

      Parameters:
      project - 目标项目
      Returns:
      每个 mod 一份元数据 JSON
    • readMappingId

      public static @Nullable String readMappingId(org.gradle.api.Project project)
      读取当前项目的映射标识,与 fromProject(Project) 打包进 DTO 的值同源.

      供 exportLoomProjectData 把它登记为任务输入;映射尚未就绪或未启用混淆时返回 null(此时任务侧的输入属性为空),而不是抛异常。

      Parameters:
      project - 目标项目
      Returns:
      映射标识,或 null 表示当前构建里还拿不到
    • readMixinMappingFiles

      public static List<String> readMixinMappingFiles(org.gradle.api.Project project)
      读取项目内全部 Mixin AP 映射文件路径,与 fromProject(Project) 打包进 DTO 的列表同源.

      供 exportLoomProjectData 登记输入指纹。注意 DTO 里保存的是路径, 消费方直接按路径读取生产者项目的文件,因此映射文件本身的内容不属于导出内容的一部分。

      Parameters:
      project - 目标项目
      Returns:
      映射文件的绝对路径,顺序与源集顺序一致
    • getDependencies

      public static List<LoomProjectData> getDependencies(org.gradle.api.Project project)
    • fromDependency

      public static Optional<LoomProjectData> fromDependency(org.gradle.api.Project project, org.gradle.api.artifacts.ProjectDependency dependency)
      读取依赖项目的跨项目数据,并让三种结果在 API 层面互不混淆.
      • 返回非空:依赖项目是 Loom 项目,且数据可用;
      • 返回 Optional.empty():依赖项目没有暴露 DATA_ELEMENTS_CONFIGURATION, 即「本来就不是 Loom 项目」,只记 debug 日志,不产生噪音;
      • 抛出异常:依赖项目确实暴露了数据文件,但文件读取或解析失败。这是「真失败」, 必须上抛——若静默降级成空结果,调用方会把「跨项目数据损坏」当成「该依赖不是 Loom 项目」, 进而静默丢掉依赖项目的 mod 与 mixin 映射,产出不完整的 remap 结果。
      Parameters:
      project - 发起查询的项目
      dependency - 待查询的项目依赖
      Returns:
      依赖项目的跨项目数据;空表示该依赖不是 Loom 项目
    • read

      public static Optional<LoomProjectData> read(Path path)
      读取跨项目数据文件.

      空结果与失败被刻意区分开:文件不存在属于「该项目还没有产出数据」的常规情形, 返回 Optional.empty() 且不写日志;文件存在却读不动或解析不了时,写一条 默认可见(warn)的日志并抛出异常,避免把损坏的数据伪装成「没有数据」。

      Parameters:
      path - exportLoomProjectData 产出的 project-data.json 路径
      Returns:
      解析出的项目数据;文件不存在时为空
      Throws:
      UncheckedIOException - 文件存在但读取失败
      com.google.gson.JsonSyntaxException - 文件存在但内容不是可用的项目数据
    • write

      public void write(Path path) throws IOException
      Throws:
      IOException