Skip to content

归档操作(ZIP/TAR)

Gradle 提供 ZipTar 任务用于创建归档文件,以及 zipTree()/tarTree() 用于解压。

创建 ZIP

kotlin
tasks.register<Zip>("packageDist") {
    archiveFileName.set("my-app-${project.version}.zip")
    destinationDirectory.set(layout.buildDirectory.dir("dist"))
    
    // 添加文件
    from(tasks.named<Jar>("jar"))
    from("src/main/resources/config") { into("config") }
    from("scripts") {
        into("bin")
        include("*.sh")
        fileMode = "755".toInt(8)
    }
    
    // 排除
    exclude("**/*.DS_Store")
}

创建 TAR

kotlin
tasks.register<Tar>("packageTar") {
    archiveFileName.set("my-app-${project.version}.tar.gz")
    destinationDirectory.set(layout.buildDirectory.dir("dist"))
    compression = Compression.GZIP  // 支持 NONE/GZIP/BZIP2/XZ
    
    from(tasks.named<Jar>("jar"))
    from("scripts") { into("bin") }
}

归档文件命名规则

kotlin
tasks.named<Jar>("jar") {
    // archiveFileName = "${archiveBaseName}-${archiveVersion}-${archiveClassifier}.${archiveExtension}"
    archiveBaseName.set("my-app")
    archiveVersion.set(project.version.toString())
    archiveClassifier.set("all")    // 如:my-app-1.0-all.jar
    // archiveExtension 默认根据任务类型设置
}

解压 ZIP

kotlin
tasks.register<Copy>("extractZip") {
    from(zipTree("libs/external.zip")) {
        include("**/*.jar")
    }
    into("$buildDir/extracted")
}

// 在依赖中使用 zipTree
tasks.register<Jar>("fatJar") {
    configurations.runtimeClasspath.get().forEach { file ->
        from(zipTree(file))
    }
    with(tasks.named<Jar>("jar").get())
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

解压 TAR

kotlin
tasks.register<Copy>("extractTar") {
    from(tarTree("archive.tar.gz"))
    into("$buildDir/unpacked")
}

处理重复文件

kotlin
tasks.named<Jar>("jar") {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE  // 保留第一个
    // DuplicatesStrategy.INCLUDE  // 保留所有(默认,会警告)
    // DuplicatesStrategy.FAIL     // 失败
    // DuplicatesStrategy.WARN     // 警告并保留
}

下一步