Skip to content

属性与环境变量优先级

源:Gradle 属性指南

当你发现修改了 gradle.properties 却没有生效时,通常是因为它被其他高优先级的配置覆盖了。理解这个优先级是排查“配置不一致”问题的唯一钥匙。

1. 优先级从高到低排列

  1. 命令行参数 (-P-D)
    • 例如:./gradlew assemble -Pversion=1.0.1 (最高权力)
  2. 系统环境变量 (ORG_GRADLE_PROJECT_...)
    • 例如:ORG_GRADLE_PROJECT_myProp=value
  3. 用户主目录下的 gradle.properties
    • 位置:~/.gradle/gradle.properties (用于存放全局的仓库密码)
  4. 项目根目录下的 gradle.properties
    • 位置:project/gradle.properties (项目标准配置)
  5. 父项目定义的属性 (如果是多项目构建)

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_ 开头的变量并将其转换为项目属性。