zhaoyu@home:~$

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很有用,配置扮演了至少三种角色:

  1. 声明依赖
  2. 作为consumer,将一系列依赖解析成文件。
  3. 作为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
    }
}

默认的canResolvedcanBeConsumed都为true。