buildscript { repositories { jcenter() mavenCentral() maven { name = "forge" url = "http://files.minecraftforge.net/maven" } } dependencies { classpath 'com.google.code.gson:gson:2.8.1' classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.115' classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2' classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0' } } plugins { id 'com.matthewprenger.cursegradle' version '1.2.0' id "com.github.breadmoirai.github-release" version "2.2.4" } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'org.ajoberstar.grgit' apply plugin: 'maven-publish' apply plugin: 'maven' version = mod_version group = "org.squiddev" archivesBaseName = "cc-tweaked-${mc_version}" minecraft { runs { client { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.console.level', 'debug' mods { computercraft { source sourceSets.main } } } server { workingDirectory project.file('run') property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' mods { computercraft { source sourceSets.main } } } } mappings channel: 'snapshot', version: "${mappings_version}".toString() accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg') } repositories { maven { name "JEI" url "http://dvs1.progwml6.com/files/maven" } maven { name "SquidDev" url "https://squiddev.cc/maven" } ivy { name "Charset" artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]" } maven { name "Amadornes" url "http://maven.amadornes.com/" } } configurations { shade compile.extendsFrom shade deployerJars } dependencies { minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" compileOnly "mezz.jei:jei-1.13.2:5.0.0.8:api" // deobfProvided "pl.asie:Charset-Lib:0.5.4.6" // deobfProvided "MCMultiPart2:MCMultiPart:2.5.3" deobf "mezz.jei:jei-1.13.2:5.0.0.8" shade 'org.squiddev:Cobalt:0.5.0-SNAPSHOT' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0' deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0" } sourceSets { main { java { exclude 'dan200/computercraft/shared/integration/mcmp' exclude 'dan200/computercraft/shared/integration/charset' } } } javadoc { include "dan200/computercraft/api/**/*.java" } jar { dependsOn javadoc manifest { attributes(["Specification-Title": "computercraft", "Specification-Vendor": "SquidDev", "Specification-Version": "25.0", "Implementation-Title": "CC: Tweaked", "Implementation-Version": "${mod_version}", "Implementation-Vendor" :"SquidDev", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")]) } from (sourceSets.main.allSource) { include "dan200/computercraft/api/**/*.java" } from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) } } import java.nio.charset.StandardCharsets import java.nio.file.* import java.util.zip.* import com.google.gson.GsonBuilder import com.google.gson.JsonElement import org.ajoberstar.grgit.Grgit import proguard.gradle.ProGuardTask task proguard(type: ProGuardTask, dependsOn: jar) { description "Removes unused shadowed classes from the jar" group "compact" injars jar.archivePath outjars "${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar" // Add the main runtime jar and all non-shadowed dependencies libraryjars "${System.getProperty('java.home')}/lib/rt.jar" doFirst { sourceSets.main.compileClasspath .filter { !it.name.contains("Cobalt") } .each { libraryjars it } } // We want to avoid as much obfuscation as possible. We're only doing this to shrink code size. dontobfuscate; dontoptimize; keepattributes; keepparameternames // Proguard will remove directories by default, but that breaks JarMount. keepdirectories 'assets/computercraft/lua**' // Preserve ComputerCraft classes - we only want to strip shadowed files. keep 'class dan200.computercraft.** { *; }' // Preserve the constructors in Cobalt library class, as we init them via reflection keepclassmembers 'class org.squiddev.cobalt.lib.** { (...); }' // LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard dontwarn 'module-info' dontwarn 'org.apache.**,org.lwjgl.**' } task proguardMove(dependsOn: proguard) { description "Replace the original jar with the minified version" group "compact" doLast { Files.move( file("${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar").toPath(), file(jar.archivePath).toPath(), StandardCopyOption.REPLACE_EXISTING ) } } processResources { inputs.property "version", mod_version inputs.property "mcversion", mc_version def hash = 'none' Set contributors = [] try { def grgit = Grgit.open(dir: '.') hash = grgit.head().id def blacklist = ['GitHub', 'dan200', 'Daniel Ratcliffe'] grgit.log().each { if (!blacklist.contains(it.author.name)) contributors.add(it.author.name) if (!blacklist.contains(it.committer.name)) contributors.add(it.committer.name) } } catch(Exception ignored) { } inputs.property "commithash", hash from(sourceSets.main.resources.srcDirs) { include 'META-INF/mods.toml' include 'data/computercraft/lua/rom/help/credits.txt' expand 'version': mod_version, 'mcversion': mc_version, 'gitcontributors': contributors.sort(false, String.CASE_INSENSITIVE_ORDER).join('\n') } from(sourceSets.main.resources.srcDirs) { exclude 'META-INF/mods.toml' exclude 'data/computercraft/lua/rom/help/credits.txt' } } task compressJson(dependsOn: jar) { group "compact" description "Minifies all JSON files, stripping whitespace" def jarPath = file(jar.archivePath) def tempPath = File.createTempFile("input", ".jar", temporaryDir) tempPath.deleteOnExit() def gson = new GsonBuilder().create() doLast { // Copy over all files in the current jar to the new one, running json files from GSON. As pretty printing // is turned off, they should be minified. new ZipFile(jarPath).withCloseable { inJar -> new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(tempPath))).withCloseable { outJar -> inJar.entries().each { entry -> if(entry.directory) { outJar.putNextEntry(entry) } else if(!entry.name.endsWith(".json")) { outJar.putNextEntry(entry) inJar.getInputStream(entry).withCloseable { outJar << it } } else { ZipEntry newEntry = new ZipEntry(entry.name) newEntry.setTime(entry.time) outJar.putNextEntry(newEntry) def element = inJar.getInputStream(entry).withCloseable { gson.fromJson(it.newReader("UTF8"), JsonElement.class) } outJar.write(gson.toJson(element).getBytes(StandardCharsets.UTF_8)) } } } } // And replace the original jar again Files.move(tempPath.toPath(), jarPath.toPath(), StandardCopyOption.REPLACE_EXISTING) } } assemble.dependsOn compressJson curseforge { apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : '' project { id = '282001' releaseType = 'beta' changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." } } publishing { publications { mavenJava(MavenPublication) { from components.java // artifact sourceJar } } } uploadArchives { repositories { if(project.hasProperty('mavenUploadUrl')) { mavenDeployer { configuration = configurations.deployerJars repository(url: project.property('mavenUploadUrl')) { authentication( userName: project.property('mavenUploadUser'), privateKey: project.property('mavenUploadKey')) } pom.project { name 'CC: Tweaked' packaging 'jar' description 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.' url 'https://github.com/SquidDev-CC/CC-Tweaked' scm { url 'https://github.com/SquidDev-CC/CC-Tweaked.git' } issueManagement { system 'github' url 'https://github.com/SquidDev-CC/CC-Tweaked/issues' } licenses { license { name 'ComputerCraft Public License, Version 1.0' url 'https://github.com/SquidDev-CC/CC-Tweaked/blob/master/LICENSE' distribution 'repo' } } } pom.whenConfigured { pom -> pom.dependencies.clear() } } } } } githubRelease { token project.hasProperty('githubApiKey') ? project.githubApiKey : '' owner 'SquidDev-CC' repo 'CC-Tweaked' targetCommitish (mc_version == "1.12.2" ? "master" : mc_version) tagName "v${mc_version}-${mod_version}" releaseName "[${mc_version}] ${mod_version}" body '' prerelease true releaseAssets.from(jar.archivePath) } test { useJUnitPlatform() testLogging { events "passed", "skipped", "failed" } } gradle.projectsEvaluated { reobfJar.dependsOn proguardMove tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint" << "-Xlint:-processing" // Causes Forge build to fail << "-Werror" } }