分发插件有助于构建用于项目分发的归档文件。分发归档文件通常包含可执行应用程序和其它支持文件,例如文档。

Base 插件

分发插件被拆分为 distribution 插件和 distribution-base 插件。

distribution-base 插件为项目添加一个名为 distributions 的扩展,其类型为 DistributionContainer

distribution 插件应用 distribution-base 插件,并在 distributions 容器扩展中创建一个名为 main 的单分发。

如果你的构建只产生一个分发,你只需要配置该分发或依赖于默认配置即可。

用法

要使用分发插件,请在你的构建脚本中包含以下内容

build.gradle.kts
plugins {
    distribution
}
build.gradle
plugins {
    id 'distribution'
}

你可以运行 gradle distZip 将主分发打包为 ZIP 文件,或运行 gradle distTar 创建 TAR 文件。要构建这两种类型的归档文件,只需运行 gradle assembleDist。文件将创建在 layout.buildDirectory.dir("distributions/${project.name}-${project.version}.«ext»")

你可以运行 gradle installDist 将未压缩的分发组装到 layout.buildDirectory.dir("install/${project.name}")

任务

分发插件会为你的项目添加一些任务,如下所示。

distZipZip

创建分发内容的 ZIP 归档文件。

distTarTask

创建分发内容的 TAR 归档文件。

assembleDistTask

依赖于distTardistZip

创建分发内容的 ZIP 和 TAR 归档文件。

installDistSync

组装分发内容并将其安装到当前机器上。

对于你添加到项目的每个额外分发,分发插件会添加以下任务,其中 distributionName 来自 Distribution.getName()

distributionNameDistZipZip

创建分发内容的 ZIP 归档文件。

distributionNameDistTarTar

创建分发内容的 TAR 归档文件。

assembleDistributionNameDistTask

依赖于distributionNameDistTardistributionNameDistZip

创建分发内容的 ZIP 和 TAR 归档文件。

installDistributionNameDistSync

组装分发内容并将其安装到当前机器上。

以下示例创建一个 custom 分发,它将导致向项目添加四个额外的任务:customDistZipcustomDistTarassembleCustomDistinstallCustomDist

build.gradle.kts
distributions {
    create("custom") {
        // configure custom distribution
    }
}
build.gradle
distributions {
    custom {
        // configure custom distribution
    }
}

假设项目名称是 myproject,版本是 1.2,运行 gradle customDistZip 将生成一个名为 myproject-custom-1.2.zip 的 ZIP 文件。

运行 gradle installCustomDist 会将分发内容安装到 layout.buildDirectory.dir("install/custom")

分发内容

src/$distribution.name/dist 目录中的所有文件将自动包含在分发中。你可以通过配置作为容器一部分的 Distribution 对象来添加额外文件。

示例 3. 配置主分发
build.gradle.kts
distributions {
    main {
        distributionBaseName = "someName"
        distributionClassifier = "classifier"
        contents {
            from("src/readme")
        }
    }
}
build.gradle
distributions {
    main {
        distributionBaseName = 'someName'
        distributionClassifier = 'classifier'
        contents {
            from 'src/readme'
        }
    }
}

在上面的示例中,src/readme 目录的内容将包含在分发中(以及默认添加的 src/main/dist 目录中的文件)。

distributionBaseNamedistributionClassifier 属性也已被修改。这将导致创建的分发归档文件具有不同的名称。

build.gradle.kts
distributions {
    main {
        distributionBaseName = "someName"
        contents {
            into("bin/config") {
                from("config")
            }
            into("lib/samples") {
                from("samples")
            }
        }
    }
}
build.gradle
distributions {
    main {
        distributionBaseName = 'someName'
        contents {
            into('bin/config') {
                from 'config'
            }
            into('lib/samples') {
                from 'samples'
            }
        }
    }
}

在上面的示例中,CopySpec 定义了内容,确保如果 bin/config 目录不存在则自动创建,并将 config 目录的内容复制到其中。同样的过程也适用于 lib/samples 目录。

Gradle 提供了一套强大的 API 来简化文件处理、管理文件依赖、生成报告等。CopySpec 只是其中一个例子。

文件操作在 处理文件 中有所涵盖。

发布

可以使用 Ivy 发布插件Maven 发布插件 来发布分发。

使用 Ivy/Maven 发布插件

要使用 Ivy 发布插件 将分发发布到 Ivy 仓库,请将其一个或两个归档任务添加到 IvyPublication 中。以下示例演示了如何将 main 分发的 ZIP 归档文件和 custom 分发的 TAR 归档文件添加到 myDistribution publication 中。

build.gradle.kts
plugins {
    `ivy-publish`
}

publishing {
    publications {
        create<IvyPublication>("myDistribution") {
            artifact(tasks.distZip.get())
            artifact(tasks["customDistTar"])
        }
    }
}
build.gradle
plugins {
    id 'ivy-publish'
}

publishing {
    publications {
        myDistribution(IvyPublication) {
            artifact distZip
            artifact customDistTar
        }
    }
}

类似地,要使用 Maven 发布插件 将分发发布到 Maven 仓库,请将其一个或两个归档任务按如下方式添加到 MavenPublication 中。

build.gradle.kts
plugins {
    `maven-publish`
}

publishing {
    publications {
        create<MavenPublication>("myDistribution") {
            artifact(tasks.distZip)
            artifact(tasks["customDistTar"])
        }
    }
}
build.gradle
plugins {
    id 'maven-publish'
}

publishing {
    publications {
        myDistribution(MavenPublication) {
            artifact distZip
            artifact customDistTar
        }
    }
}