Changes

4,902 bytes added ,  14:32, 18 June 2022
Update to 1.19
Line 1: Line 1: −
{{Under construction}}
+
A '''dependency''' is the reliance of a piece of software on another piece of software. In the context of Minecraft Forge, it is a mod or library which another mod relies or ''depends'' on.
A '''dependency''' is the reliance of a piece of software on another piece of software. In the context of Minecraft Forge, it is a mod or library which another mod has a dependency on.
      
Dependencies are declared in three ways:
 
Dependencies are declared in three ways:
Line 17: Line 16:     
Soft dependencies usually take the form of isolated code dependencies, where the code that depends on the soft-dependency is isolated from the rest of the mod until the soft-dependency is detected as being present.
 
Soft dependencies usually take the form of isolated code dependencies, where the code that depends on the soft-dependency is isolated from the rest of the mod until the soft-dependency is detected as being present.
 +
 +
== Declaring Dependencies ==
 +
A mod declares a dependency on a mod or library through Gradle, through the <code>dependencies</code> block.<ref>[https://docs.gradle.org/7.4.2/userguide/declaring_dependencies.html Gradle User Guide: ''Declaring dependencies'']</ref>
 +
 +
For example, to declare a dependency on the <code>net:minecraftforge:eventbus:5.0.3</code> library from the <code>main</code> source set:
 +
<syntaxhighlight lang="gradle">
 +
dependencies {
 +
    // 'implementation' is for the main source set
 +
    implementation "net.minecraftforge:eventbus:5.0.3"
 +
}
 +
</syntaxhighlight>
 +
 +
{{Tip|ForgeGradle automatically adds the [https://files.minecraftforge.net/maven/ Forge Maven] and [https://maven.apache.org/repository/ Maven Central] repositories to projects. If a dependency is not present in these (such as dependencies on other mods), the repository containing the dependency must be declared in the <code>repositories</code> block of the Gradle buildscript.<ref>[https://docs.gradle.org/current/userguide/declaring_repositories.html Gradle User Guide: ''Declaring repositories'']</ref>}}
 +
 +
=== Deobfuscating Dependencies ===
 +
Mods (and libraries which use Minecraft code) are usually released as an SRG-obfuscated JAR, which prevents their direct use in development environments due to mismatch between SRG names from the mod/library and the MCP/mapped names in the development environment.
 +
 +
These mods/libraries must be deobfuscated to the development environment's mappings first. This is done using the <code>fg.deobf</code> function, which creates a dependency which is dynamically remapped to the local environment's mappings.
 +
 +
For example, to declare a dependency on the <code>mezz.jei:jei-1.16.5:7.6.1.75</code> library (which is obfuscated):
 +
<syntaxhighlight lang="gradle">
 +
dependencies {
 +
    implementation fg.deobf("mezz.jei:jei-1.16.5:7.6.1.75")
 +
}
 +
</syntaxhighlight>
 +
 +
=== Flat Directory Repositories ===
 +
There are occasions where it is needed to temporarily add a dependency on a JAR file that is not present in a Maven repository, such as to add a mod which adds some developer tools during runtime. Gradle allows declaring '''flat directory repositories''', which use a local directory as a simplified repository.<ref>[https://docs.gradle.org/current/userguide/declaring_repositories.html#sub:flat_dir_resolver Gradle User Guide: ''Flat directory repository'']</ref>
 +
 +
A flat directory repository is declared using a <code>flatDir</code> block within the <code>repositories</code> block, and specifying directories using <code>dirs</code>:
 +
<syntaxhighlight lang="gradle">
 +
repositories {
 +
    flatDir {
 +
        dirs 'lib'
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
When a dependency artifact is searched for in a flat directory repository, it will look for the following files in order (<code>''ext''</code> defaults to <code>jar</code>)<ref>[https://github.com/gradle/gradle/blob/v7.4.2/subprojects/core-api/src/main/java/org/gradle/api/artifacts/repositories/FlatDirectoryArtifactRepository.java gradle/gradle; tag v7.4.2; org.gradle.api.artifacts.repositories.FlatDirectoryArtifactRepository]</ref>:
 +
* <code>''<artifact>''-''<version>''.''<ext>''</code>
 +
* <code>''<artifact>''-''<version>''-''<classifier>''.''<ext>''</code>
 +
* <code>''<artifact>''.''<ext>''</code>
 +
* <code>''<artifact>''-''<classifier>''.''<ext>''</code>
 +
 +
For example, for the dependency <code>org.junit.jupiter:junit-jupiter-api:5.7.2</code>, it will first search for <code>junit-jupiter-api-5.7.2.jar</code> then <code>junit-jupiter-api.jar</code>. The group ID in the dependency descriptor must be present (due to the presence of non-flat directory repositories as added by ForgeGradle), but it will always be ignored.
 +
 +
{{Tip/Warning
 +
|Flat directory repositories should ''only'' be used temporarily in a local environment, and not used to include a required dependency for your project. For a actual dependency used by your mod, use a remote Maven repository holding the artifact.
 +
}}
 +
 +
=== CurseMaven ===
 +
A commonly used alternative is [https://www.cursemaven.com/ CurseMaven](credits to Wyn Price) which allows you to depend on any file uploaded to [https://www.curseforge.com/minecraft/mc-mods/ CurseForge].
 +
 +
First add the CurseMaven Repository within the <code>repositories</code> block:
 +
<syntaxhighlight lang="gradle">
 +
repositories {
 +
    maven {
 +
        url 'https://www.cursemaven.com'
 +
        // FG4: It's recommended to uncomment the following block
 +
        // content {
 +
        //    includeGroup "curse.maven"
 +
        // }
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 +
Then declare a dependency using the following format:
 +
* <code>''curse.maven'':''<description>-<project-id>'':''<file-id>''</code>
 +
 +
As an example, the dependency <code>curse.maven:jei-238222:3295418 </code>, would resolve to [https://www.curseforge.com/minecraft/mc-mods/jei/files/3295418 this file] on CurseForge.
 +
 +
For more information on usage, visit [https://www.cursemaven.com/ CurseMaven]