build.gradle 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. buildscript {
  2. repositories {
  3. mavenCentral()
  4. }
  5. dependencies {
  6. classpath("commons-io:commons-io:2.6")
  7. }
  8. }
  9. import org.jetbrains.gradle.ext.ActionDelegationConfig
  10. import java.nio.file.FileVisitResult
  11. import java.nio.file.Files
  12. import java.nio.file.Path
  13. import java.nio.file.SimpleFileVisitor
  14. import java.nio.file.attribute.BasicFileAttributes
  15. import java.util.stream.Stream
  16. import java.util.zip.ZipEntry
  17. import java.util.zip.ZipInputStream
  18. import java.util.zip.ZipOutputStream
  19. plugins {
  20. id "org.jetbrains.gradle.plugin.idea-ext" version "0.7"
  21. }
  22. allprojects {
  23. apply plugin: "java"
  24. group "me.shedaniel"
  25. archivesBaseName = rootProject.name
  26. version = rootProject.mod_version
  27. sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaVersion.VERSION_1_8
  28. }
  29. idea.project.settings {
  30. delegateActions {
  31. delegateBuildRunToGradle = false
  32. testRunner = ActionDelegationConfig.TestRunner.PLATFORM
  33. }
  34. runConfigurations {
  35. "Fabric: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
  36. project = rootProject.project(":fabric")
  37. taskNames = Collections.singletonList("runClient")
  38. }
  39. "Fabric: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
  40. project = rootProject.project(":fabric")
  41. taskNames = Collections.singletonList("runServer")
  42. }
  43. "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
  44. project = rootProject.project(":forge")
  45. taskNames = Collections.singletonList("runClient")
  46. }
  47. "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
  48. project = rootProject.project(":forge")
  49. taskNames = Collections.singletonList("runServer")
  50. }
  51. }
  52. }
  53. task buildMerged {
  54. doLast {
  55. def folder = file(".gradle/.mergemods")
  56. folder.mkdirs()
  57. def fabricJar = file("fabric/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
  58. def forgeJar = file("forge/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
  59. def fabricFolder = new File(folder, ".tempFabric")
  60. def forgeFolder = new File(folder, ".tempForge")
  61. def mergeFolder = new File(folder, ".tempMerge")
  62. def policyMap = new HashMap<String, String>()
  63. file("merging.policy").eachLine {
  64. if (it.isBlank() || it.startsWith("#")) return
  65. def env = it.substring(0, it.indexOf(' '))
  66. if (env == "FABRIC")
  67. policyMap.put(it.substring(env.length() + 1), "Fabric")
  68. else if (env == "FORGE")
  69. policyMap.put(it.substring(env.length() + 1), "Forge")
  70. else throw new IllegalStateException("Illegal env $env at $it")
  71. }
  72. forgeFolder.deleteDir()
  73. fabricFolder.deleteDir()
  74. mergeFolder.deleteDir()
  75. unzip(fabricJar, fabricFolder)
  76. unzip(forgeJar, forgeFolder)
  77. mergeFolder.mkdirs()
  78. Stream.of(forgeFolder, fabricFolder).each { useFolder ->
  79. try {
  80. Files.walkFileTree(useFolder.toPath(), new SimpleFileVisitor<Path>() {
  81. @Override
  82. FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
  83. try {
  84. File ogFile = file.toFile()
  85. File outFile = new File(mergeFolder, ogFile.getAbsolutePath().replace(useFolder.getAbsolutePath(), ""))
  86. outFile.getParentFile().mkdirs()
  87. if (outFile.exists()) {
  88. def env = useFolder.getName().substring(5)
  89. def fileName = outFile.getAbsolutePath().replace(mergeFolder.getAbsolutePath(), "")
  90. def policyEnv = policyMap.get(fileName)
  91. if (policyEnv == null) {
  92. throw new IllegalStateException("Unhandled duplicate file: $fileName")
  93. }
  94. println "Chose env ${policyEnv.toUpperCase(Locale.ROOT)} for duplicate file: $fileName"
  95. if (policyEnv != env)
  96. return FileVisitResult.CONTINUE
  97. }
  98. if (!ogFile.isDirectory()) {
  99. org.apache.commons.io.FileUtils.copyFile(ogFile, outFile)
  100. } else {
  101. org.apache.commons.io.FileUtils.copyDirectory(ogFile, outFile)
  102. }
  103. } catch (IOException e) {
  104. e.printStackTrace()
  105. System.exit(0)
  106. }
  107. return FileVisitResult.CONTINUE
  108. }
  109. })
  110. } catch (IOException e) {
  111. e.printStackTrace()
  112. System.exit(0)
  113. }
  114. }
  115. File finalMerge = file("build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
  116. finalMerge.parentFile.mkdirs()
  117. finalMerge.delete()
  118. compress(mergeFolder.toPath(), finalMerge)
  119. folder.deleteDir()
  120. }
  121. }
  122. buildMerged.mustRunAfter project(":fabric").tasks.getByName("build")
  123. buildMerged.mustRunAfter project(":forge").tasks.getByName("build")
  124. static def compress(Path sourceDir, File zipFile) {
  125. try {
  126. final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
  127. Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
  128. @Override
  129. FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
  130. try {
  131. Path targetFile = sourceDir.relativize(file)
  132. outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
  133. byte[] bytes = Files.readAllBytes(file)
  134. outputStream.write(bytes, 0, bytes.length)
  135. outputStream.closeEntry()
  136. } catch (IOException e) {
  137. e.printStackTrace()
  138. }
  139. return FileVisitResult.CONTINUE
  140. }
  141. })
  142. outputStream.close()
  143. } catch (IOException e) {
  144. e.printStackTrace()
  145. }
  146. }
  147. static def unzip(File zipFile, File destDir) {
  148. if (!destDir.exists())
  149. destDir.mkdirs()
  150. FileInputStream fis
  151. byte[] buffer = new byte[1024]
  152. try {
  153. fis = new FileInputStream(zipFile)
  154. ZipInputStream zis = new ZipInputStream(fis)
  155. ZipEntry zipEntry = zis.getNextEntry()
  156. while (zipEntry != null) {
  157. if (!zipEntry.isDirectory()) {
  158. File newFile = new File(destDir, zipEntry.getName())
  159. new File(newFile.getParent()).mkdirs()
  160. FileOutputStream fos = new FileOutputStream(newFile)
  161. int len
  162. while ((len = zis.read(buffer)) > 0) {
  163. fos.write(buffer, 0, len)
  164. }
  165. fos.close()
  166. }
  167. zis.closeEntry()
  168. zipEntry = zis.getNextEntry()
  169. }
  170. zis.closeEntry()
  171. zis.close()
  172. fis.close()
  173. } catch (IOException e) {
  174. e.printStackTrace()
  175. }
  176. }