All Known Subinterfaces:
DeobfProjectView, RemappedProjectView
All Known Implementing Classes:
DeobfProjectView.Impl, ProjectView.AbstractProjectView, RemappedProjectView.Impl

public interface ProjectView
  • Method Details

    • getLoomProjectDataDependencies

      Stream<LoomProjectData> getLoomProjectDataDependencies(String name)
      返回指定配置中依赖项目的跨项目数据.

      这些数据会被打进 jar processor 的 spec 并参与其 hashCode,因此它决定了 processed jar 的路径与共享缓存的命中。数据有两个来源:构建级内存共享表 (由依赖项目自身的 afterEvaluate 写入)与依赖项目导出的数据文件。后者由依赖项目的 任务在执行期产出,配置期(冷启动)必然不存在,所以配置期能否读到数据只取决于前者, 也就是只取决于依赖项目是否已经完成求值。

      非隔离模式:本方法在读取前用 Project.evaluationDependsOn(String) 强制每个 依赖项目先完成求值,把「依赖项目的 afterEvaluate 先于本次读取」钉死,从而共享表必定 命中、哈希恒定包含依赖数据,与配置顺序、是否 --parallel 无关。只有当确实会消费这些 数据(disableProjectDependantMods() 为 false)时才强制求值,不给不需要它的构建增加 配置开销。若两个 Loom 项目互相声明项目依赖,强制求值会让 Gradle 抛出循环求值异常 (CircularReferenceException,消息里会点名参与循环的项目);Loom 不做环检测,交给 Gradle 报告。

      隔离模式(Isolated Projects):跨项目求值被 Gradle 禁止,无法用上面的手段补救, 依赖项目的数据要么恰好因配置顺序已可得,要么缺失。这里做两件事弥补:

      • 把依赖项目的 exportLoomProjectData 产物声明为本项目编译任务的输入 (wireProjectDataTask),Gradle 据此自动把该任务纳入任务图——本次构建里 数据文件就一定会在被读取前产出,不再依赖「上一次构建恰好跑过导出」;
      • 数据仍缺失时(例如对端不是 Loom 项目)输出一条按(当前项目,依赖项目)去重的告警。
      需要说明的是:配置期读取与执行期产出之间存在时序差,接线保证的是「文件在本次构建内会被 产出、供执行期消费」,它不能把配置期那次读取变成「一定能读到」(配置期本就不执行任务)。 彻底消除该不确定性需要把 mapped/processed jar 的产出从配置期搬进任务,属于架构级改动。
      Parameters:
      name - 配置名(通常是 runtimeClasspath / compileClasspath)
      Returns:
      依赖项目的数据流;不是 Loom 项目的依赖不会出现在其中
    • getLoomProjectDependencies

      @Deprecated default Stream<org.gradle.api.Project> getLoomProjectDependencies(String name)
      Deprecated.
      已无生产实现,改用 getLoomProjectDataDependencies(String)
      旧的跨项目 Project 视图,现恒为空.

      隔离模式不允许触碰其它项目的模型,这个方法已经没有任何实现会返回非空值; 调用它只会静默拿到空集合。需要依赖项目的信息请改用 getLoomProjectDataDependencies(String) 与 LoomProjectData。

      Parameters:
      name - 配置名
      Returns:
      恒为空流
    • getMods

      List<FabricModJson> getMods()
    • disableProjectDependantMods

      boolean disableProjectDependantMods()
    • areEnvironmentSourceSetsSplit

      boolean areEnvironmentSourceSetsSplit()