Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/firstdarkdev/modpublisher

A dual publishing Gradle Plugin to publish mods to Modrinth, Curseforge and GitHub in one go
https://github.com/firstdarkdev/modpublisher

curseforge curseforge-api github modrinth modrinth-api

Last synced: 6 days ago
JSON representation

A dual publishing Gradle Plugin to publish mods to Modrinth, Curseforge and GitHub in one go

Awesome Lists containing this project

README

        

## ModPublisher

ModPublisher is a Gradle Plugin that allows modders to publish their mods to Modrinth, Curseforge and GitHub in one go.

No need for separate plugins, just one!

---

### Setup

For full documentation, checkout [ModPublisher Docs](https://modpublisher.fdd-docs.com/)

Groovy DSL

To use this plugin inside your project, first you have to add our maven.

To do this, open up `settings.gradle` and add the following:

```groovy
pluginManagement {
repositories {
gradlePluginPortal()
maven {
url "https://maven.firstdark.dev/releases"
}

/*
For unreleased versions
maven {
url "https://maven.firstdark.dev/snapshots"
}
*/
}
}
```

Next, in your `build.gradle` add:

![badge](https://maven.firstdarkdev.xyz/api/badge/latest/releases/com/hypherionmc/modutils/modpublisher?color=40c14a&name=modpublisher)
![badge](https://maven.firstdarkdev.xyz/api/badge/latest/snapshots/com/hypherionmc/modutils/modpublisher?color=40c14a&name=modpublisher-snapshot)

```groovy
plugins {
id "com.hypherionmc.modutils.modpublisher" version "VERSION"
}
```

Replace VERSION with the version above.

Finally, add the following to `build.gradle` file:

```groovy
publisher {
// Setup the required API keys. You only need to define the keys for
// the platforms you plan on uploading to
apiKeys {
// Modrinth Token
modrinth System.getenv("MODRINTH_TOKEN")
// Curseforge Token
curseforge System.getenv("CURSE_TOKEN")
// GitHub Token
github System.getenv("GITHUB_TOKEN")
}

// Enable Debug mode. When enabled, no files will actually be uploaded
setDebug(true)

// Curseforge Project ID
setCurseID("1234")

// Modrinth Project ID
setModrinthID("dsgfhs79789")

// Type of release. beta, alpha or release
// You can also use VersionType.BETA, VersionType.ALPHA or VersionType.RELEASE
setVersionType("beta")

// Changelog. This can be a file, string, OR, gist/github url
// For example: markdown.md, or "This is my changelog"
// Or: https://raw.githubusercontent.com/hypherionmc/changelogs/changelog.md
// Or https://gist.githubusercontent.com/hypherionmc/92f825d3c9337964cc77c9c8c9bf65e6/raw/ceeaaee5b98c688a23398864fe480b84796a1651/test_gist.md
setChangelog("changelog.md")

// Required for Modrinth/GitHub
setProjectVersion("1.20.2-${project.version}")

// Fancy display name for the upload.
// Will default to the project version if not set
setDisplayName("[1.20.x] Simple Discord Link - ${project.version}")

// The supported game versions
setGameVersions("1.20", "1.20.1", "1.20.2")

// The modloaders your upload supports.
// This can also be an Enum from ModLoader,
// like setLoaders(ModLoader.FABRIC, ModLoader.FORGE)
setLoaders("forge", "fabric")

// The new Curseforge Environment tag. Optional
// Valid values are "server", "client" or "both"
// You can also use CurseEnvironment.BOTH, or CurseEnvironment.SERVER or CurseEnvironment.CLIENT
setCurseEnvironment("both")

// Upload the release, but keep it "private" until you are ready
// Unreleased feature on CurseForge, working on Modrinth
setIsManualRelease(true)

// The file to be uploaded. This can be a file, task, or string.
// setArtifact("build/libs/mymod.jar")
// setArtifact(jar.getArchiveFile().get())
// If this is a task, the task specified will be executed before publishing
setArtifact(jar)

// Override the artifact uploaded to modrinth
// setPlatformArtifact(Platform.Modrinth, "build/libs/mymod.jar")
// setPlatformArtifact(Platform.Modrinth, jar.getArchiveFile().get())
// If this is a task, the task specified will be executed before publishing
// Valid platforms are modrinth, curseforge and github
setPlatformArtifact("modrinth", modrinthJar)

// Disable the built in Fractureizer scanner
setDisableMalwareScanner(true)

// Add supported java versions. Currently only used by CurseForge
// Supports anything that can be parsed using JavaVersion.toVersion()
setJavaVersions(JavaVersion.VERSION_1_8, 11)

// Safety check to check if the artifact contains a valid mod metadata entry,
// which could possibly mean that the jar is empty
setDisableEmptyJarCheck(true)

// Additional files to upload. Same as artifact, this can be a task, file or string
addAdditionalFile(jar, secondJar)

// Additional files to upload with a custom display name and changelog.
// Currently only supported on Curseforge
addAdditionalFile {
// File, Task or String
artifact jar
displayName "Some Name"
changelog "Hello Changelog"
}
}
```

Additional values that can be added to the above:

```groovy
// GitHub options
github {
// GitHub repo to publish to. Overrides githubRepo
repo = "OWNER/REPO"

// Tag to use for GitHub release. Defaults to version
tag = "v${project.version}"

// Whether to create a tag for the GitHub release, if one doesn't exist yet. Defaults to true
createTag = true

// Whether to create the GitHub release if it doesn't exist yet. Defaults to true
createRelease = true

// Whether to update the GitHub release if it already exists. Defaults to true
updateRelease = true

// Whether the release should be left as an unpublished draft.
//
// If enabled, newly created releases and existing drafts will not be published.
// Instead, a draft release is used.
//
// If disabled, the release will be published.
// This option does not allow converting a published release to a draft.
//
// Defaults to false
draft = false

// The commitish ref the tag should target (ignored when tag already exists)
target = "main"
}

// Modrinth Dependencies.
// Accepts a slug or id
modrinthDepends {
// Multiple required dependencies
required "fabric-api", "craterlib"

// Single dependency
required "fabric-api"

// Optional dependency
optional 'optional-dep'

// Your mod is not compatible with this mod
incompatible 'breaks-with'

// Your mod embeds this dependency
embedded 'fabric-api'
}

// Curse Dependencies
curseDepends {
// Multiple required dependencies
required "fabric-api", "craterlib"

// Single dependency
required "fabric-api"

// Optional dependency
optional 'optional-dep'

// Your mod is not compatible with this mod
incompatible 'breaks-with'

// Your mod embeds this dependency
embedded 'fabric-api'
}
```

Kotlin DSL

To use this plugin inside your project, first you have to add our maven.

To do this, open up `settings.gradle.kts` and add the following:

```kotlin
pluginManagement {
repositories {
gradlePluginPortal()
maven {
url = uri("https://maven.firstdark.dev/releases")
}

/*
For Unreleased Versions
maven {
url = uri("https://maven.firstdark.dev/snapshots")
}*/
}
}
```

Next, in your `build.gradle.kts` add:

![badge](https://maven.firstdarkdev.xyz/api/badge/latest/releases/com/hypherionmc/modutils/modpublisher?color=40c14a&name=modpublisher)
![badge](https://maven.firstdarkdev.xyz/api/badge/latest/snapshots/com/hypherionmc/modutils/modpublisher?color=40c14a&name=modpublisher-snapshot)

```kotlin
plugins {
id("com.hypherionmc.modutils.modpublisher") version "VERSION"
}
```

Replace VERSION with the version above.

Finally, add the following to `build.gradle.kts` file:

```kotlin
publisher {
// Setup the required API keys. You only need to define the keys for
// the platforms you plan on uploading to
apiKeys {
// Modrinth Token
modrinth(System.getenv("MODRINTH_TOKEN"))
// Curseforge Token
curseforge(System.getenv("CURSE_TOKEN"))
// GitHub Token
github(System.getenv("GITHUB_TOKEN"))
}

// Enable Debug mode. When enabled, no files will actually be uploaded
debug.set(true)

// Curseforge Project ID
curseID.set("12345")

// Modrinth Project ID
modrinthID.set("sdjkg8867")

// GitHub repo to publish to. Only required for GitHub
githubRepo.set("OWNER/REPO")

// Type of release. beta, alpha or release
// You can also use VersionType.BETA, VersionType.ALPHA or VersionType.RELEASE
versionType.set("release")

// Changelog. This can be a file, string, OR, gist/github url
// For example: markdown.md, or "This is my changelog"
// Or: https://raw.githubusercontent.com/hypherionmc/changelogs/changelog.md
// Or https://gist.githubusercontent.com/hypherionmc/92f825d3c9337964cc77c9c8c9bf65e6/raw/ceeaaee5b98c688a23398864fe480b84796a1651/test_gist.md
changelog.set("Coming Soon")

// Required for Modrinth/GitHub
projectVersion.set("1.3.0")

// Fancy display name for the upload.
// Will default to the project version if not set
displayName.set("MyAwesomeMod - Version")

// The supported game versions
// setGameVersions("1.20", "1.20.1", "1.20.2")
gameVersions.set(listOf("1.19.3", "1.19.4"))

// The modloaders your upload supports.
// This can also be an Enum from ModLoader,
// like setLoaders(ModLoader.FORGE, ModLoader.FABRIC)
loaders.set(listOf("forge", "fabric"))

// The new Curseforge Environment tag. Optional
// Valid values are "server", "client" or "both"
// You can also use CurseEnvironment.BOTH, or CurseEnvironment.SERVER or CurseEnvironment.CLIENT
// setCurseEnvironment(CurseEnvironment.CLIENT)
curseEnvironment.set("both")

// Upload the release, but keep it "private" until you are ready
// Unreleased feature on CurseForge, working on Modrinth
isManualRelease.set(true)

// The file to be uploaded. This can be a file, task, or string.
// setArtifact("build/libs/mymod.jar")
// setArtifact(jar.getArchiveFile().get())
// If this is a task, the task specified will be executed before publishing
artifact.set(tasks.jar)

// Override the artifact uploaded to modrinth
// setPlatformArtifact(Platform.Modrinth, "build/libs/mymod.jar")
// setPlatformArtifact(Platform.Modrinth, jar.getArchiveFile().get())
// If this is a task, the task specified will be executed before publishing
// Valid platforms are modrinth, curseforge and github
setPlatformArtifact("modrinth", modrinthJar)

// Disable the built in Fractureizer scanner
disableMalwareScanner.set(true)

// Safety check to check if the artifact contains a valid mod metadata entry,
// which could possibly mean that the jar is empty
disableEmptyJarCheck.set(true)

// Add supported java versions. Currently only used by CurseForge
// Supports anything that can be parsed using JavaVersion.toVersion()
setJavaVersions(JavaVersion.VERSION_1_8, 11)

// Additional files to upload. Same as artifact, this can be a task, file or string
additionalFiles.set(listOf(tasks.jar))

// Additional files to upload with a custom display name and changelog.
// Currently, supports CurseForge only
addAdditionalFile {
// File, Task or String
artifact(tasks.jar)
displayName("Test Name")
changelog("Some Changelog")
}
}
```

Additional values that can be added to the above:

```kotlin
// GitHub options
github {
// GitHub repo to publish to. Overrides githubRepo
repo = "OWNER/REPO"

// Tag to use for GitHub release. Defaults to version
tag = "v${project.version}"

// Whether to create a tag for the GitHub release, if one doesn't exist yet. Defaults to true
createTag = true

// Whether to create the GitHub release if it doesn't exist yet. Defaults to true
createRelease = true

// Whether to update the GitHub release if it already exists. Defaults to true
updateRelease = true

// Whether the release should be left as an unpublished draft.
//
// If enabled, newly created releases and existing drafts will not be published.
// Instead, a draft release is used.
//
// If disabled, the release will be published.
// This option does not allow converting a published release to a draft.
//
// Defaults to false
draft = false

// The commitish ref the tag should target (ignored when tag already exists)
target = "main"
}

// Modrinth Dependencies.
// Accepts a slug or id
modrinthDepends {
// Multiple required dependencies
required("fabric-api", "craterlib")

// Single dependency
required("fabric-api")

// Optional dependency
optional("optional-mod")

// Your mod is not compatible with this mod
incompatible("breaks-with")

// Your mod embeds this dependency
embedded("rift")
}

// Curse Dependencies
curseDepends {
// Multiple required dependencies
required("fabric-api", "craterlib")

// Single dependency
required("fabric-api")

// Optional dependency
optional("optional-mod", "another-mod")

// Your mod is not compatible with this mod
incompatible("breaks-with")

// Your mod embeds this dependency
embedded("rift")
}
```