如何在Gradle中压缩单个文件?含Copy任务免临时文件实现
在Gradle中直接在Copy/Deb任务内压缩单个文件的方案
针对你构建Deb包时需要压缩manpage文件的场景,完全不用手动创建临时文件,Gradle提供的transform方法可以直接在Copy任务的处理流程中完成二进制压缩,完美适配你的需求。
具体实现代码
来看修改后的任务配置:
import java.util.zip.GZIPOutputStream task buildDeb(type: Deb, dependsOn: ['jar']) { // ... 其他Deb包相关配置 from (file('packaging/deb-package/manpage')) { into '/usr/share/man/man1' // 直接重命名为带.gz后缀的目标文件名 rename(/.*/, deploymentName + '.1.gz') filteringCharset = 'UTF-8' // 先完成令牌替换的文本过滤 filter(ReplaceTokens, tokens: [ 'TITLE': appTitle, // ... 你的其他令牌配置 ]) // 添加GZIP压缩的transformer,直接操作流无需临时文件 transform { InputStream inputStream, OutputStream outputStream -> new GZIPOutputStream(outputStream).withStream { gzos -> inputStream.copyTo(gzos) } } } // ... 其他Deb包相关配置 }
方案说明
- 重命名后缀:直接把目标文件名改成
.gz,符合man文件的压缩格式要求 - 先过滤后压缩:先通过
filter完成文本令牌替换,确保压缩的是已经处理好的最终内容 - 流级别的压缩:
transform方法直接操作输入输出流——过滤后的文件内容通过输入流传入,我们用GZIPOutputStream包装输出流,直接把压缩后的内容写入目标位置,全程不需要创建任何临时文件
这种方式既避开了Ant文本过滤仅支持Reader接口的限制,又完全满足你“在Copy任务内完成压缩”的需求,是最简洁高效的实现方式。
内容的提问来源于stack exchange,提问作者Dávid Horváth
相关产品推荐
相关产品推荐

