如果一個子專案依賴另一個子專案會怎麼樣?如果一個專案需要另一個專案產生的 Artifact 會怎麼樣?

structuring builds 2

這是多專案建置的常見用例。Gradle 為此提供了專案相依性

依賴另一個專案

讓我們探索一個具有以下佈局的理論性多專案建置

.
├── api
│   ├── src
│   │   └──...
│   └── build.gradle.kts
├── services
│   └── person-service
│       ├── src
│       │   └──...
│       └── build.gradle.kts
├── shared
│   ├── src
│   │   └──...
│   └── build.gradle.kts
└── settings.gradle.kts
.
├── api
│   ├── src
│   │   └──...
│   └── build.gradle
├── services
│   └── person-service
│       ├── src
│       │   └──...
│       └── build.gradle
├── shared
│   ├── src
│   │   └──...
│   └── build.gradle
└── settings.gradle

在此範例中,有三個子專案,分別稱為 sharedapiperson-service

  1. person-service 子專案依賴於其他兩個子專案 sharedapi

  2. api 子專案依賴於 shared 子專案。

我們使用 : 分隔符來定義專案路徑,例如 services:person-service:shared。 有關定義專案路徑的更多資訊,請查閱 Settings.include(java.lang.String[]) 的 DSL 文件。

settings.gradle.kts
rootProject.name = "dependencies-java"
include("api", "shared", "services:person-service")
shared/build.gradle.kts
plugins {
    id("java")
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
}
api/build.gradle.kts
plugins {
    id("java")
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
    implementation(project(":shared"))
}
services/person-service/build.gradle.kts
plugins {
    id("java")
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
    implementation(project(":shared"))
    implementation(project(":api"))
}
settings.gradle
rootProject.name = 'basic-dependencies'
include 'api', 'shared', 'services:person-service'
shared/build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13"
}
api/build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13"
    implementation project(':shared')
}
services/person-service/build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13"
    implementation project(':shared')
    implementation project(':api')
}

專案相依性會影響執行順序。 它會導致先建置另一個專案,並將另一個專案的類別輸出添加到類別路徑中。 它還會將另一個專案的相依性添加到類別路徑中。

如果您執行 ./gradlew :api:compile,則會先建置 shared 專案,然後再建置 api 專案。

依賴另一個專案產生的 Artifact

有時,您可能想要依賴另一個專案中特定任務的輸出,而不是整個專案。 然而,不建議從一個專案到另一個專案顯式宣告任務相依性,因為這會在任務之間引入不必要的耦合。

建議對相依性進行建模的方式是,當一個專案中的任務依賴於另一個專案的輸出時,產生輸出並將其標記為「輸出」 Artifact。 Gradle 的相依性管理引擎允許您在專案之間共享任意 Artifact,並按需建置它們。