属性与环境变量优先级
当你发现修改了 gradle.properties 却没有生效时,通常是因为它被其他高优先级的配置覆盖了。理解这个优先级是排查“配置不一致”问题的唯一钥匙。
1. 优先级从高到低排列
- 命令行参数 (
-P或-D)- 例如:
./gradlew assemble -Pversion=1.0.1(最高权力)
- 例如:
- 系统环境变量 (
ORG_GRADLE_PROJECT_...)- 例如:
ORG_GRADLE_PROJECT_myProp=value
- 例如:
- 用户主目录下的
gradle.properties- 位置:
~/.gradle/gradle.properties(用于存放全局的仓库密码)
- 位置:
- 项目根目录下的
gradle.properties- 位置:
project/gradle.properties(项目标准配置)
- 位置:
- 父项目定义的属性 (如果是多项目构建)
2. 系统属性 (-D) vs 项目属性 (-P)
- 项目属性 (
-P): 用于构建逻辑,例如:if (project.hasProperty("release")) { ... }。 - 系统属性 (
-D): 用于配置 JVM 或 Gradle 运行环境,例如:org.gradle.daemon=true。
3. 在代码中优雅读取
专家建议
始终使用 findProperty 而不是直接访问变量名,以避免属性不存在时崩溃。
kotlin
val mySecret: String = project.findProperty("MY_SECRET") as? String ?: "default"4. 环境变量在 CI/CD 中的应用
在 Jenkins 或 GitHub Actions 中,推荐将 Secrets 设为环境变量,Gradle 会自动识别以 ORG_GRADLE_PROJECT_ 开头的变量并将其转换为项目属性。