gradle-术语
Artifact
一个文件或者构建生产的目录,如JAR,ZIP文件,或者本地可执行文件。
Dependency
依赖是一个在构建、测试或运行时需要的软件的一个指针。如下:
dependencies {
testImplementation 'junit:junit:4.13'
}
Configuration
一个Configuration代表了一组构建和他们的依赖,是包含了所有依赖的FileCollection的一个实例。声明和设置一个Configuration如下:
Configuration的继承
apply plugin: 'java'
configurations {
//添加一个 configuration
myConfiguration
//定义myIntegrationTestsCompile配置继承testImplementation,父类配置的所有构件在子类中都是可用的。
myIntegrationTestsCompile.extendsFrom(testImplementation)
//禁止传递依赖
compileClasspath.transitive = false
testCompileClasspath.transitive = false
}
配置的可解析性(resolvable)和可消费性(consumable)
Configurations 是依赖解析的基础。在依赖解析时,区分producer和consumer很有用,配置扮演了至少三种角色:
- 声明依赖
- 作为consumer,将一系列依赖解析成文件。
- 作为producer,向其他需要消费的工厂暴露artifact和依赖。
某个应用依赖lib库,至少需要一个依赖。即第一种角色:
configurations {
// declare a "configuration" named "someConfiguration"
someConfiguration
}
dependencies {
// add a project dependency to the "someConfiguration" configuration
someConfiguration project(":lib")
}
上面的配置只是说明了app依赖了lib库,但是我们用lib来执行程序或者是测试,并不清楚,为此我们经常使用配套的配置,用来明确声明意图。
configurations {
// 声明一个用于解析应用的compile路径的配置compileClasspath。
compileClasspath.extendsFrom(someConfiguration)
// 声明一个用于解析应用的runtime路径的配置runtimeClasspath。
runtimeClasspath.extendsFrom(someConfiguration)
}
上图中,我们拥有三个不同角色的配置。
- someConfiguration 用于声明依赖。
- compileClasspath 和 runtimeClasspath 配置需要解析。当被解析时,需要相应的compile路径和runtime路径。
Configuration 中的canBeResolved
表示配置可以被解析,一个可以被解析的图谱,我们可以计算它的图谱。进一步
解析图谱中的组件,组中获得artifact。canBeResolved
设置为false表示该配置不会给解析,这种配置只是声明了依赖。
尝试解析他们会报错。一个可以解析的配置往往至少继承一个非解析配置(可继承多个)。
另一端,library项目(the producer),我们使用配置表示可以消费些什么。通常,
我们要对lib进行编译,我们需要lib的API,我们不需要它的运行时依赖。所以lib项目只需要暴露api配置。这种配置是可消费性的,
可以通过canBeConsumed
配置。
configurations {
// 定义一个配置,表示为Consumers提供API。
exposedApi {
canBeResolved = false
canBeConsumed = true
}
// 定义一个配置,表示consumers需要实现该组件。
exposedRuntime {
canBeResolved = false
canBeConsumed = true
}
}
默认的canResolved
和canBeConsumed
都为true。