Gradle多项目构建:按环境排除编译步骤的实现方法
实现本地编译/QA环境拉取远程JAR的Gradle构建方案
你可以通过环境开关+依赖切换的方式实现需求:本地环境默认编译子项目,QA环境通过参数/环境变量触发,直接从Artifactory拉取已发布的子项目JAR包,跳过本地编译步骤。以下是具体配置:
1. 定义环境识别开关
在根项目的build.gradle开头添加环境判断逻辑,通过命令行参数或环境变量区分QA环境:
// 识别QA构建模式:支持两种触发方式 // 方式1:命令行传参 ./gradlew build -PqaBuild=true // 方式2:设置环境变量 QA_BUILD=1 ./gradlew build def isQaBuild = project.hasProperty('qaBuild') ? project.property('qaBuild').toBoolean() : System.getenv('QA_BUILD')?.toBoolean() ?: false
2. 配置子项目任务开关
在根项目的subprojects块中,添加QA模式下的任务禁用逻辑,跳过编译、测试、打包等本地构建任务:
subprojects { task allDeps(type: DependencyReportTask) {} if (isQaBuild) { // QA模式下禁用所有编译、测试、打包任务 tasks.withType(JavaCompile) { enabled = false } tasks.withType(Test) { enabled = false } tasks.withType(Jar) { enabled = false } // 清空子项目build任务的依赖,避免执行多余操作 build.dependsOn = [] } }
3. 切换依赖来源
根据环境开关,选择依赖本地子项目(本地模式)或Artifactory远程JAR(QA模式):
// 统一管理版本号,确保和Artifactory上发布的子项目版本一致 def subProjectVersion = "1.0.0" dependencies { // 公共运行时依赖保持不变 runtimeOnly "com.partygaming.thirdparty:aopalliance:1.0" runtimeOnly "com.partygaming.thirdparty:spring-aop:5.3.22" runtimeOnly "com.partygaming.thirdparty:spring-tx:5.3.22" runtimeOnly "com.partygaming.thirdparty:spring-expression:5.3.22" runtimeOnly "com.partygaming.thirdparty:osgi.core:8.0.0" runtimeOnly "com.partygaming.thirdparty:disruptor:3.4.4" runtimeOnly "com.partygaming.thirdparty:commons-beanutils:1.9.4" runtimeOnly "com.partygaming.thirdparty:commons-io:2.11.0" runtimeOnly "com.partygaming.thirdparty:commons-logging:1.2" runtimeOnly "com.partygaming.thirdparty:guava:31.1-jre" runtimeOnly "com.partygaming.thirdparty:jakarta.activation-api:1.2.2" runtimeOnly "com.partygaming.thirdparty:objenesis:3.3" runtimeOnly "com.partygaming.thirdparty:jakarta.xml.bind-api:2.3.3" runtimeOnly "com.partygaming.thirdparty:jaxb-impl:2.3.6" if (!isQaBuild) { // 本地模式:依赖本地子项目 runtimeOnly project(':abc-api') runtimeOnly project(':xyz-api') runtimeOnly project(':abc-impl') runtimeOnly project(':xyz-impl') } else { // QA模式:从Artifactory拉取已发布的子项目JAR runtimeOnly "com.yourcompany:abc-api:${subProjectVersion}" runtimeOnly "com.yourcompany:xyz-api:${subProjectVersion}" runtimeOnly "com.yourcompany:abc-impl:${subProjectVersion}" runtimeOnly "com.yourcompany:xyz-impl:${subProjectVersion}" } }
4. 调整依赖收集任务
修改getFlatDependencies任务,QA模式下直接从远程依赖收集JAR,无需读取本地子项目的classpath:
task getFlatDependencies(type: Copy) { if (!isQaBuild) { // 本地模式:从子项目编译/运行时classpath收集依赖 from { subprojects.findAll { it.subprojects.isEmpty() } .collect { it.configurations.runtimeClasspath + it.configurations.compileClasspath } } } // 公共运行时依赖两种模式都需要收集 from configurations.runtimeClasspath into 'lib' exclude "sourceanalyzer-1.0.jar" } build.dependsOn(getFlatDependencies)
5. 配置Artifactory仓库(若未配置)
在根项目build.gradle中添加Artifactory仓库地址及认证信息:
repositories { mavenLocal() maven { url = uri("https://your-artifactory-url/repository/maven-releases/") // 通过环境变量传递认证信息,避免硬编码 credentials { username = System.getenv('ARTIFACTORY_USER') password = System.getenv('ARTIFACTORY_PWD') } } }
使用方式
- 本地构建(编译子项目):直接执行默认命令
./gradlew build
- QA环境构建(拉取远程JAR):通过参数或环境变量触发
# 方式1:命令行传参 ./gradlew build -PqaBuild=true # 方式2:设置环境变量 export QA_BUILD=1 ./gradlew build
内容的提问来源于stack exchange,提问作者kaluva
相关产品推荐
相关产品推荐

