如何在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
相关产品推荐
相关产品推荐

