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

基础插件

分发插件分为 distributiondistribution-base 插件。

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

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

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

用法

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

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

依赖于: distTar, distZip

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

installDistSync

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

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

distributionNameDistZipZip

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

distributionNameDistTarTar

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

assembleDistributionNameDistTask

依赖于: distributionNameDistTar, distributionNameDistZip

创建分发内容的 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 对象来添加其他文件。

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。以下示例演示如何将主分发包的 ZIP 归档文件和自定义分发包的 TAR 归档文件添加到 myDistribution 发布

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
        }
    }
}