You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在settings.gradle.kts与build.gradle.kts中共享公共变量

在Gradle的settings.gradle.kts和build.gradle.kts中复用nexusBaseUrl的官方方案

方案一:通过Settings脚本注入项目Extra属性

利用Gradle生命周期中Settings阶段先于Build阶段执行的特性,在Settings中定义变量后注入所有项目的extra属性,实现跨文件复用。

修改settings.gradle.kts

// 统一定义nexusBaseUrl
val nexusBaseUrl = System.getenv("NEXUS_BASE_URL") ?: "my-default-url"

// 将变量注入所有项目的extra属性,供Build脚本访问
gradle.allprojects {
    extra["nexusBaseUrl"] = nexusBaseUrl
}

pluginManagement {
    val nexusUsername: String by settings
    val nexusPassword: String by settings

    repositories {
        maven {
            credentials {
                username = nexusUsername
                password = nexusPassword
            }
            // 直接使用已定义的变量
            url = uri("$nexusBaseUrl/nexus/content/repositories/gradle-plugins/")
        }
    }
}

修改build.gradle.kts

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.tasks.testing.logging.TestExceptionFormat

plugins {
    java
    checkstyle
    id("com.github.johnrengelman.shadow") version "7.1.2"
}

subprojects {
    val nexusUsername: String by project
    val nexusPassword: String by project
    // 从项目extra中获取复用的nexusBaseUrl
    val nexusBaseUrl: String by project.extra

    repositories {
        maven {
            name = "NexusPublic"
            credentials {
                username = nexusUsername
                password = nexusPassword
            }
            url = uri("$nexusBaseUrl/nexus/content/groups/public/")
        }
    }
}

方案二:使用buildSrc共享常量

如果需要复用的属性或构建逻辑较多,推荐使用Gradle官方支持的buildSrc目录,将共享代码抽离成独立类,实现更优雅的复用。

1. 创建buildSrc目录结构

在项目根目录下创建:

buildSrc/
└── src/
    └── main/
        └── kotlin/
            └── BuildConstants.kt

2. 编写BuildConstants.kt

object BuildConstants {
    // 统一定义nexusBaseUrl
    val NEXUS_BASE_URL = System.getenv("NEXUS_BASE_URL") ?: "my-default-url"
}

3. 修改settings.gradle.kts

pluginManagement {
    val nexusUsername: String by settings
    val nexusPassword: String by settings

    repositories {
        maven {
            credentials {
                username = nexusUsername
                password = nexusPassword
            }
            // 直接引用buildSrc中的常量
            url = uri("${BuildConstants.NEXUS_BASE_URL}/nexus/content/repositories/gradle-plugins/")
        }
    }
}

4. 修改build.gradle.kts

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
// 引入buildSrc中的常量类
import BuildConstants

plugins {
    java
    checkstyle
    id("com.github.johnrengelman.shadow") version "7.1.2"
}

subprojects {
    val nexusUsername: String by project
    val nexusPassword: String by project

    repositories {
        maven {
            name = "NexusPublic"
            credentials {
                username = nexusUsername
                password = nexusPassword
            }
            // 引用共享常量
            url = uri("${BuildConstants.NEXUS_BASE_URL}/nexus/content/groups/public/")
        }
    }
}

方案说明

  • 两种方案均为Gradle官方设计的标准用法,无hack手段
  • 方案一适合单个属性的简单复用,无需额外目录
  • 方案二更适合多属性、复杂构建逻辑的共享,扩展性更强
  • 两种方案均对团队透明,无需开发者额外配置本地文件

内容的提问来源于stack exchange,提问作者nofar mishraki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:10:37