Class MinecraftProvider

java.lang.Object
net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider
Direct Known Subclasses:
LegacyMergedMinecraftProvider, MergedMinecraftProvider, SingleJarMinecraftProvider, SplitMinecraftProvider

public abstract class MinecraftProvider extends Object
  • Constructor Details

  • Method Details

    • provideClient

      protected boolean provideClient()
    • provideServer

      protected boolean provideServer()
    • provide

      public void provide() throws Exception
      内存配置段:与产物是否已落位无关的那部分.

      产物生产(下载/抽取,子类再含合并/拆分/env-only 透传)**不在这里**,由 provideMinecraftJars() 承担。拆开的理由是判据的求值时机: projectionBlocker() 里那条 Forge 系判据要读 isLegacyForge(),而它依赖已解析的 userdev 配置——依赖 provider 只能在库处理器把仓库定稿之后建立 (见 CompileConfiguration.setupDependencyProviders 的注释),因此生产整体推迟到那之后。

      库注入(MinecraftLibraryProvider)仍留在本段:它必须在依赖 provider 之前完成, 且服务端库列表取自 bundle 元数据。推迟路径下元数据由 earlyProjectionBlocker() 的末条保证命中 L2 规格缓存,读它不会打开 server jar。

      Throws:
      Exception
    • provideMinecraftJars

      public void provideMinecraftJars() throws Exception
      产物生产段:由 CompileConfiguration 在 setupDependencyProviders 之后调用.

      只有 provide() 判定「判据尚不可求值」的形态(Forge 系)才会真正生产;其余形态 已在 provide() 里就地生产完毕,这里什么也不做——生产段对每个 provider 恰好执行一次。

      Throws:
      Exception
    • produceOwnJars

      protected void produceOwnJars() throws Exception
      子类在此生产自己的产物(合并/拆分/env-only 透传).

      由 provide() 与 provideMinecraftJars() 在基类产物之后调用,因此 「我的输入就是基类产物」这条关系由调用点保证。投影时不会调用本方法:那时产物由 registerProviderTasks(java.util.Map<java.nio.file.Path, net.fabricmc.loom.pipeline.RemapMinecraftTaskRegistry.Producer>) 登记的执行期任务承担(子类在那里决定自己怎么接线)。

      Throws:
      Exception
    • isTaskProduction

      protected final boolean isTaskProduction()
      Returns 本次是否已把产物生产交给执行期任务. 子 provider(合并/拆分)据此决定自己怎么生产.
      Returns:
      本次是否已把产物生产交给执行期任务
    • projectionBlocker

      protected @Nullable String projectionBlocker()
      Returns 不能把产物生产投影成执行期任务的原因;可以投影时为 null..

      每一条都是一个「配置期必须真读产物 jar(或必须由配置期落盘)」的形态。投影后产物只在执行期落位, 这些配置期读者会读到不存在(或上一代)的文件,因此必须整批退回配置期生产——那个路径与改造前逐字一致。

      只能在依赖 provider 建立之后调用:最后那条 Forge 系判据要读 isLegacyForge(), 它依赖已解析的 userdev 配置。provide() 执行得更早,那里只能求 earlyProjectionBlocker();两者的差集就是「本形态为什么必须把生产推迟」。

      • legacy Forge(FG2 形态的 userdev,MC 1.7-1.12.2):patch 流程走 FG2 工作目录下的一组产物, MinecraftLegacyPatchedProvider 在配置期按路径读 vanilla jar。

      与依赖 provider 无关的那几条见 earlyProjectionBlocker()。

      Returns:
      不能把产物生产投影成执行期任务的原因;可以投影时为 null
    • earlyProjectionBlocker

      protected @Nullable String earlyProjectionBlocker()
      Returns 与依赖 provider 无关的那部分判据;子类覆写点..

      本方法能在 provide() 里求值(那时依赖 provider 尚未建立),因此它是子类表达 「本形态不能投影」的唯一位置:命中即整批回退,生产与库注入都留在改造前的位置与顺序上。

      • disableObfuscation:mapped 阶段自身整批回退到配置期生产,配置期会按路径读 vanilla jar; 它同时覆盖 unobfuscated Forge,故必须排在 Forge 判据之前——那一条要读依赖 provider。
      • 签名校验开启:校验要打开 jar 读签名与内容,本次未随链迁移(见 verificationEnabled())。
      • 映射可能不是 tiny v2:V1 映射的字段名补全在配置期读 merged jar,且只支持单 jar 形态。
      • bundle 元数据未进 L2 规格缓存:服务端库的注入是配置期事实,元数据没有缓存就必须先 下载并打开 server jar——那正是本次要移出配置期的动作。
      Returns:
      与依赖 provider 无关的那部分判据;子类覆写点
    • isFinalProductKnown

      protected boolean isFinalProductKnown()
      Returns 此刻 getMinecraftJars() 是否已能求值..

      默认恒为真。Forge 的合并形态是唯一例外:它的最终产物是 patched jar,其路径要等 MinecraftPatchedProvider.initPatchedFiles() 之后才确定,而那时 patch 链已经自己走过 registerTaskProducedArtifact(java.nio.file.Path, net.fabricmc.loom.pipeline.RemapMinecraftTaskRegistry.Producer)(同一条 registerJarOutputs() 登记路径), 因此这里跳过不会让任何产物失去登记。

      Returns:
      此刻 getMinecraftJars() 是否已能求值
    • registerProviderTasks

      protected void registerProviderTasks(Map<Path,RemapMinecraftTaskRegistry.Producer> producers)
      子 provider 在此注册自己的产物(合并/拆分),并把它们的输入登记成任务依赖.

      默认什么也不做:产物就是下载/抽取出来的那些 jar。

      Parameters:
      producers - 本次已登记的产物(可写):键是产物的绝对规范化路径
    • registerTaskProducedArtifact

      public void registerTaskProducedArtifact(Path artifact, RemapMinecraftTaskRegistry.Producer producer)
      登记一个由**本 provider 之外的接线方**(Forge 的 patch 链)产出的最终 jar.

      这些 jar 同样出现在 getMinecraftJars() 里,因此必须走同一条登记路径: 消费侧(getMinecraftJarsCollection(OFFICIAL)、mapped provider 的重映射任务)靠这里拿到 「我的输入由哪个任务产出」的任务依赖。只把产物当成路径交给它们,冷缓存下消费方就会在产物落位前开跑。

      只能在 provide() 之后调用:那时 getMinecraftJars() 才有意义, 且首次 registerJarOutputs() 已经把命名空间下的集合实例发出去,这里的重复登记是「并进」语义。

      Parameters:
      artifact - 产物路径(绝对规范化)
      producer - 该产物的生产者(携带任务路径)
    • producerOf

      protected static @Nullable RemapMinecraftTaskRegistry.Producer producerOf(Map<Path,RemapMinecraftTaskRegistry.Producer> producers, Path artifact)
      Returns 本批登记中该产物的生产者;未登记时为 null. 供子 provider 建任务依赖用.
      Returns:
      本批登记中该产物的生产者;未登记时为 null
    • dependOn

      protected static void dependOn(org.gradle.api.Task task, @Nullable RemapMinecraftTaskRegistry.Producer producer)
      把生产者登记成任务依赖;未投影(无任务)时什么也不做.

      dependsOn/builtBy 都接受任务路径:产出方可能由另一份 Loom classloader 配置, 把对方的任务实例交过来会在使用处抛 ClassCastException。

    • productionTaskPath

      public @Nullable String productionTaskPath(Path artifact)
      Returns 该产物的产出任务路径;本 provider 未投影或该路径不由本 provider 产出时为 null..

      供消费方把「我的输入就是你的产出」表达成任务依赖。

      Returns:
      该产物的产出任务路径;本 provider 未投影或该路径不由本 provider 产出时为 null
    • outputForTasks

      public org.gradle.api.file.FileCollection outputForTasks(Path artifact)
      Returns 该产物「按路径声明 + 携带产出任务依赖」的单文件集合..

      未投影时是裸文件,与改造前的语义一致(消费侧只需路径,产物早已在配置期落盘)。

      Returns:
      该产物「按路径声明 + 携带产出任务依赖」的单文件集合
    • addProducerDependency

      public void addProducerDependency(org.gradle.api.Task task, Path artifact)
      把「本任务以该产物为输入」表达成任务依赖;未投影时什么也不做.
    • normalize

      protected static Path normalize(Path path)
      Returns 路径的绝对规范化形式. 生产者的键一律用它,避免「同一文件两种写法」查不到生产者.
      Returns:
      路径的绝对规范化形式
    • cacheKey

      protected String cacheKey()
    • initFiles

      protected void initFiles()
    • extractBundledServerJar

      public final void extractBundledServerJar() throws IOException
      Throws:
      IOException
    • workingDir

      public File workingDir()
    • dir

      public File dir(String path)
    • file

      public File file(String path)
    • path

      public Path path(String path)
    • getMinecraftClientJar

      public File getMinecraftClientJar()
    • getMinecraftExtractedServerJar

      public @Nullable File getMinecraftExtractedServerJar()
    • getMinecraftServerJar

      public File getMinecraftServerJar()
    • minecraftVersion

      public String minecraftVersion()
    • getVersionInfo

      public MinecraftVersionMeta getVersionInfo()
    • isLegacyVersion

      public boolean isLegacyVersion()
      Returns:
      true if the minecraft version is older than 1.3.
    • isLegacySplitOfficialNamespaceVersion

      public boolean isLegacySplitOfficialNamespaceVersion()
      Returns true if the minecraft version is between Beta 1.0 (inclusive) and 1.3 (exclusive), which splits the official mapping namespace into env-specific variants.
    • getJarPrefix

      public String getJarPrefix()
    • setJarPrefix

      public void setJarPrefix(String jarSuffix)
    • getServerBundleMetadata

      public @Nullable BundleMetadata getServerBundleMetadata()
    • getMinecraftJars

      public abstract List<Path> getMinecraftJars()
    • getOfficialNamespace

      public abstract MappingsNamespace getOfficialNamespace()
    • getProject

      protected org.gradle.api.Project getProject()
    • getExtension

      protected LoomGradleExtension getExtension()
    • refreshDeps

      public boolean refreshDeps()
    • minecraftWorkingDirectory

      public static File minecraftWorkingDirectory(org.gradle.api.Project project, String version)