Gradle 版本目录(已发布):如何动态设置存储库

Gradle Version Catalog (Published): How to dynamically set up repository

我对 Gradle 没有那么多经验,目前 运行 在尝试使用新版本目录功能时遇到问题。

目标:

问题:

  1. 根据current Gradle documentation,任何要使用该目录的项目都应该在settings.gradle(.kts)中定义已发布的版本目录;
    插入那段代码会导致错误,因为 Gradle 没有可用于工件查找的存储库定义
  2. 因此,添加存储库定义:
// my settings.gradle.kts
rootProject.name = "catalog-consumer"

dependencyResolutionManagement {
    val catalogVersion = "0.1.0"
    val artifactoryUri = "..."
    val catalogGAV = "..."

    repositories{
        maven {

            url = uri("$artifactoryUri")
            credentials {
                // TODO: how to access user's local gradle.properties for credentials?
                username = "$artifactory_user"     // key as generated by JFrog
                password = "$artifactory_password" // key as generated by JFrog
            }
        }
    }

    versionCatalogs {
        create("libs") {
            from("$catalogGAV")
        }
    }
}
  1. 现在,面临用户的 gradle.properties 似乎尚未加载的问题 - 但硬编码凭据不可行 :)

问题: 手动检查和加载用户的 gradle.properties 文件是唯一的选择吗?

最初,在阅读文档时,我假设设置文件可能会尝试从项目的 build.gradle.kts 中查找现有的存储库定义,但事实也并非如此。如果我理解正确的话,设置文件先于其他一切被评估,不是吗?

手动加载用户的配置对我来说似乎很奇怪,因此,我想问一下我是否缺少一个机制或生命周期钩子来处理这个问题。也可能是我错误地使用了版本目录功能:D

非常感谢任何提示!

在此处查看文档:https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:handling_credentials

命名存储库凭据

如果您命名存储库并添加 credentials(PasswordCredentials::class)...

// ./settings.gradle.kts

dependencyResolutionManagement {
  repositories {
    maven {
      name = "mySecureRepository"
      credentials(PasswordCredentials::class)
      // url = uri(<<some repository url>>)
    }
  }
}

然后 Gradle 将 automatically fetch the username/pass 来自第一个找到的定义:

  1. 使用命令行参数
    ./gradlew build -PmySecureRepositoryUsername=my-username
    
  2. 前缀为ORG_GRADLE_PROJECT_的环境变量(这对CI/CD很有用)
    ORG_GRADLE_PROJECT_mySecureRepositoryUsername=my-username
    ORG_GRADLE_PROJECT_mySecureRepositoryPassword=my-password
    
  3. $GRADLE_USER_HOME/gradle.properties
    mySecureRepositoryUsername=my-username
    mySecureRepositoryPassword=my-password
    
  4. gradle.properties 在项目根目录中 - 显然不要将凭据放入您的项目中!
  5. gradle.properties在Gradle安装目录下

手动供应商

如果您需要手动设置 属性 名称,那么您可以定义自己的提供商。

// ./settings.gradle.kts

val artifactoryUser = providers.gradleProperty("artifactory_user")
val artifactoryPassword = providers.gradleProperty("artifactory_password")

dependencyResolutionManagement {
  repositories {
    maven {
      name = "mySecureRepository"
      credentials {
        username = artifactoryUser.get()
        password = artifactoryPassword.get()
      }
      // url = uri(<<some repository url>>)
    }
  }
}

同样,然后 Gradle 将从

中获取这些属性
  • $GRADLE_USER_HOME/gradle.properties
    artifactory_user=my-username
    artifactory_password=my-password
    
  • 或者环境变量
    ORG_GRADLE_PROJECT_artifactory_user=myUsername
    ORG_GRADLE_PROJECT_artifactory_password=my-password