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

基础插件

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

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

distribution 插件应用 distribution-base 插件并在名为 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 归档。

distTar任务

创建分发内容的 TAR 归档。

assembleDist任务

依赖于distTardistZip

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

installDist同步

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

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

distributionNameDistZipZip

创建分发内容的 ZIP 归档。

distributionNameDistTarTar

创建分发内容的 TAR 归档。

assembleDistributionNameDist任务

依赖于distributionNameDistTardistributionNameDistZip

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

installDistributionNameDist同步

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

以下示例创建了一个 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 Publish PluginMaven Publish Plugin 发布。

使用 Ivy/Maven 发布插件

要使用 Ivy Publish Plugin 将分发发布到 Ivy 仓库,请将其一个或两个归档任务添加到 IvyPublication。以下示例演示了如何将 main 分发的 ZIP 归档和 custom 分发的 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 Publish Plugin 将分发发布到 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
        }
    }
}