build.gradle 7.2 KB

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