本章描述了Gradle 1.0中可用的原始发布机制,此机制已由替代模型取代. 本章详细介绍的方法(基于上任务)已被弃用,不应在新版本中使用. 我们对其进行了介绍,以帮助用户使用和更新使用它的现有内部版本.

Introduction

本章介绍如何声明项目的外发工件以及如何使用它们(例如上载它们). 我们将项目的工件定义为项目提供给外界的文件. 这可能是库,ZIP发行版或任何其他文件. 一个项目可以发布所需数量的工件.

Artifacts and configurations

像依存关系一样,工件按配置分组. 实际上,配置可以同时包含工件和依赖项.

对于项目中的每个配置,在应用基本插件时,Gradle提供任务upload ConfigurationNamebuild ConfigurationName . 这些任务的执行将构建或上载属于各个配置的工件.

此清单显示了Java插件添加的配置. 其中两个配置与工件的使用有关. archives配置是将工件分配到的标准配置. Java插件会自动将默认jar分配给此配置. 我们将在上进一步讨论 runtime配置. 与依赖项一样,您可以声明任意数量的定制配置,并为其分配工件.

Declaring artifacts

Archive task artifacts

您可以使用存档任务来定义工件:

示例1.使用归档任务定义工件
build.gradle
task myJar(type: Jar)

artifacts {
    archives myJar
}
build.gradle.kts
val myJar by tasks.registering(Jar::class)

artifacts {
    add("archives", myJar)
}

重要的是要注意,作为构建的一部分创建的自定义归档不会自动分配给任何配置. 您必须明确地执行此分配.

File artifacts

您还可以使用文件来定义工件:

例子2.使用文件定义工件
build.gradle
def someFile = file("$buildDir/somefile.txt")

artifacts {
    archives someFile
}
build.gradle.kts
val someFile = file("$buildDir/somefile.txt")

artifacts {
    add("archives", someFile)
}

Gradle将根据文件名找出工件的属性. 您可以自定义以下属性:

Example 3. Customizing an artifact
build.gradle
task myTask(type:  MyTaskType) {
    destFile = file("$buildDir/somefile.txt")
}

artifacts {
    archives(myTask.destFile) {
        name 'my-artifact'
        type 'text'
        builtBy myTask
    }
}
build.gradle.kts
val myTask by tasks.registering(MyTaskType::class) {
    destFile = file("$buildDir/somefile.txt")
}

artifacts {
    add("archives", myTask.map { it -> it.destFile }) {
        name = "my-artifact"
        type = "text"
        builtBy(myTask)
    }
}

有一种基于地图的语法,用于使用文件定义工件. 映射必须包含定义文件的file条目. 该地图可能包括其他工件属性:

例子4.使用文件定义工件的映射语法
build.gradle
task generate(type:  MyTaskType) {
    destFile = file("$buildDir/somefile.txt")
}

artifacts {
    archives file: generate.destFile, name: 'my-artifact', type: 'text', builtBy: generate
}
build.gradle.kts
val generate by tasks.registering(MyTaskType::class) {
    destFile = file("$buildDir/somefile.txt")
}

artifacts {
    add("archives",
        mapOf("file" to generate.get().destFile, "name" to "my-artifact", "type" to "text", "builtBy" to generate))
}

Publishing artifacts

我们已经说过,每种配置都有一个特定的上传任务. 在执行上载之前,您必须配置上载任务并定义将工件发布到的位置. 您定义的存储库(如声明存储库中所述 )不会自动用于上载. 实际上,其中一些存储库仅允许下载工件,而不允许上传工件. 这是如何配置配置的上传任务的示例:

例子5.上传任务的配置
build.gradle
repositories {
    flatDir {
        name "fileRepo"
        dirs "repo"
    }
}

uploadArchives {
    repositories {
        add project.repositories.fileRepo
        ivy {
            credentials {
                username "username"
                password "pw"
            }
            url "http://repo.mycompany.com"
        }
    }
}
build.gradle.kts
repositories {
    flatDir {
        name = "fileRepo"
        dirs("repo")
    }
}

tasks.named<Upload>("uploadArchives") {
    repositories {
        add(project.repositories["fileRepo"])
        ivy {
            credentials {
                username = "username"
                password = "pw"
            }
            url = uri("http://repo.mycompany.com")
        }
    }
}

如您所见,您可以使用对现有存储库的引用,也可以创建新的存储库.

如果上传存储库定义了多种模式,则Gradle必须选择一种模式用于上传每个文件. 默认情况下,Gradle将上传到url参数和可选的layout参数定义的模式. 如果未提供url参数,则Gradle将使用第一个定义的artifactPattern上载,或者使用第一个定义的ivyPattern上载Ivy文件(如果已设置).

本节介绍了如何上传到Maven存储库.

More about project libraries

如果应该将您的项目用作库,则需要定义该库的构件以及这些构件的依赖项. Java插件为此目的添加了一个runtime配置,并隐含地假设runtime依赖项是您要发布的工件的依赖项. 当然,这是完全可定制的. 您可以添加自己的自定义配置,也可以让现有配置从其他配置扩展. 您可能具有一组不同的工件,这些工件具有一组不同的依赖关系. 该机制非常强大且灵活.

如果有人想将您的项目用作库,则只需声明依赖项所依赖的配置即可. Gradle依赖项提供了configuration属性来声明这一点. 如果未指定,则使用default配置(请参阅什么是依赖项配置 ). 将您的项目用作库既可以在多项目构建中进行,也可以从存储库中检索您的项目. 在后一种情况下,存储库中的ivy.xml描述符应该包含所有必要的信息. 如果使用Maven存储库,则没有如上所述的灵活性. 有关如何发布到Maven存储库的信息,请参阅" 上载到Maven存储库 "部分.