Как читать учетные данные репозитория Maven только при необходимости?

У меня есть сценарий Gradle Kotlin DSL, который публикует некоторые артефакты в локальном репозитории Maven:

    publishing {
        publications {
            create<MavenPublication>("maven") {
                groupId = "my.company"
                artifactId = project.name
                version = "0.0.1"
                from(components["java"])
            }
        }
        repositories {
            maven {
                url = uri("https://maven.mycompany.com/content/repositories/whatever")
                credentials {
                    username = (read from some file)
                    password = (read from some file)
                }
            }
        }
    }

Как видите, Gradle всегда пытается прочитать имя пользователя и пароль из файла. Даже если задача публикации не будет выполняться.

Я попытался исправить это, переместив учетные данные в блок doFirst в задаче публикации, но код просто никогда не выполняется:

publishing {
  doFirst { // this doesn't compile, doFirst doesn't exist here 
  }
}
tasks.getByName("publish").doFirst {
  // this compiles just fine, but it's never executed
}
tasks.named("publish") {
  doFirst {
    // this compiles just fine, but it's never executed
  }
}

Как установить учетные данные, чтобы это происходило только при выполнении задачи публикации?


person Jorn    schedule 17.07.2020    source источник


Ответы (1)


Вы всегда настраиваете учетные данные независимо от того, нужны они или нет. Вам необходимо условно настроить учетные данные. Этого можно добиться разными способами.

Например, предположим, что вы никогда не хотите публиковать версии моментальных снимков. Ваша сборка может выглядеть примерно так:

version = "0.0.1-SNAPSHOT"

publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
        }
        repositories {
            maven {
                url = uri("https://maven.mycompany.com/content/repositories/whatever")
                if (!version.toString().contains("SNAPSHOT")) {
                    credentials {
                        username = property("username") as String
                        password = property("password") as String
                    }
                }
            }
        }
    }
}

Обратите внимание на условное. На этапе конфигурации Gradle оценит это условие и пропустит credentials { }, потому что версия содержит SNAPSHOT.

Как я уже сказал, вы можете сделать это разными способами. Однако лучше всего использовать переменные среды:

publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
        }
        repositories {
            maven {
                url = uri("https://maven.mycompany.com/content/repositories/whatever")
                credentials {
                    username = System.getenv()["username"]
                    password = System.getenv()["password"]
                }
            }
        }
    }
}

Никаких условий. null является приемлемым значением для учетных данных и не имеет значения на этапе настройки. Когда вы публикуете, имеет значение только то, когда вы получите NullPointerException

person Francisco Mateo    schedule 24.07.2020
comment
Я пошел с комбинацией ваших двух предложений: условное выражение с использованием переменной среды для переключения чтения учетных данных и чтение самих учетных данных как переменных проекта (из файла gradle.properties в моей зашифрованной домашней папке). - person Jorn; 24.07.2020