diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4da65e0a..f88bcd2e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -95,6 +95,8 @@ jobs: - run: | git config --global user.name github-actions git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com + - name: Install advzip for ZIP optimization + run: sudo apt install advancecomp - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: @@ -118,7 +120,7 @@ jobs: VERSION_NAME: ${{ fromJson(steps.split_version.outputs.result).version_name }} VERSION_TYPE: ${{ fromJson(steps.split_version.outputs.result).version_type }} if: ${{ always() }} - run: ./gradlew :$VERSION_NAME:makeZip -Ptype=$VERSION_TYPE + run: ./gradlew :$VERSION_NAME:makeZip -Ptype=$VERSION_TYPE -Poptimize_zip=true - name: Upload Zip as Artifact if: ${{ always() }} uses: actions/upload-artifact@v4 diff --git a/build.gradle b/build.gradle index 3cd459de..ccd9fdde 100644 --- a/build.gradle +++ b/build.gradle @@ -781,7 +781,8 @@ subprojects { } } - task makeZip(type: Zip, dependsOn: [generateConfiguration]) { + def makeZip = tasks.register('makeZip', Zip) { + dependsOn generateConfiguration archiveBaseName = rootProject.name archiveVersion = project.version destinationDirectory = file(PATH_BUILD + '/distributions') @@ -815,6 +816,21 @@ subprojects { } } + // This uses advzip: https://linux.die.net/man/1/advzip + def optimizeZip = tasks.register('optimizeZip', Exec) { + dependsOn makeZip + description = "Optimizes the NeoForm ZIP-file in-place" + commandLine "advzip", "--recompress", "-k", "-4" + argumentProviders.add( + objects.newInstance(ZipPathArgumentProvider).tap { + file = makeZip.flatMap(AbstractArchiveTask::getArchiveFile) + } + ) + } + if (optimize_zip) { + makeZip.configure { finalizedBy optimizeZip } + } + def componentMaker = objects.newInstance(ComponentMaker) def neoformComponent = componentMaker.componentFactory.adhoc('neoform') components.add(neoformComponent) diff --git a/buildSrc/src/main/groovy/net/minecraftforge/mcpconfig/tasks/PathArgumentProvider.groovy b/buildSrc/src/main/groovy/net/minecraftforge/mcpconfig/tasks/PathArgumentProvider.groovy new file mode 100644 index 00000000..57efc1ac --- /dev/null +++ b/buildSrc/src/main/groovy/net/minecraftforge/mcpconfig/tasks/PathArgumentProvider.groovy @@ -0,0 +1,18 @@ +package net.minecraftforge.mcpconfig.tasks + +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.process.CommandLineArgumentProvider + +abstract class ZipPathArgumentProvider implements CommandLineArgumentProvider { + @InputFile + @PathSensitive(PathSensitivity.RELATIVE) + abstract RegularFileProperty getFile() + + @Override + Iterable asArguments() { + [file.get().asFile.absolutePath] + } +} diff --git a/gradle.properties b/gradle.properties index 3620c405..2c7ae5c3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,6 @@ org.gradle.parallel=true org.gradle.caching=true -org.gradle.configuration-cache=true \ No newline at end of file +org.gradle.configuration-cache=true + +# Run ZIP optimizations using advzip, which requires the tool to be installed +optimize_zip=false