对于Maven存储库凭据,buildscript中的Gradle变量为null



对于上下文,我在这里的最终目标是通过环境变量或使用Maven settings.xml注入用于构建脚本插件的Maven凭据。

我创建了这个buildscript闭包来获取信任:

buildscript {
ext.nexusCreds = {
def id = "releases"
def username = System.getenv("NEXUS_USER")
def password = System.getenv("NEXUS_PASSWORD")
if (!(username && password && username.trim() && password.trim())) {
File mavenSettings = new File("${System.properties['user.home']}/.m2/settings.xml")
if (mavenSettings.exists()) {
def xmlSlurper = new XmlSlurper()
def settings = xmlSlurper.parse(mavenSettings)
username = settings.servers.children().find { it.id == id }.username
password = settings.servers.children().find { it.id == id }.password
}
}
println("Username: $username")
println("Password: $password")
[username: username, password: password]
}()
repositories {
mavenLocal()
maven {
url "http://nexus.ourStagingEnv.com/content/repositories/releases/"
credentials {
username nexusCreds.username
password nexusCreds.password
}
}
jcenter()
mavenCentral()
}
dependencies {
classpath group: 'com.myPlugin', name: 'myPlugin', version: '1.0.0'
}
}

问题是,当构建到自定义的"maven"闭包时,它似乎认为"username"为null:

A problem occurred evaluating root project 'myProject'.
> Could not find method username() for arguments [deployment] on Credentials [username: null] of type org.gradle.internal.credentials.DefaultPasswordCredentials_Decorated.

注意,"username"one_answers"password"变量都会在"nextCreds"闭包中打印为非null(我在settings.xml中设置了这些变量)

奇怪的部分是:如果我在"nextCreds"闭包中对这些值进行硬编码,那么一切都很好。

ext.nexusCreds = {
def id = "releases"
def username = System.getenv("NEXUS_USER")
def password = System.getenv("NEXUS_PASSWORD")
if (!(username && password && username.trim() && password.trim())) {
File mavenSettings = new File("${System.properties['user.home']}/.m2/settings.xml")
if (mavenSettings.exists()) {
def xmlSlurper = new XmlSlurper()
def settings = xmlSlurper.parse(mavenSettings)
username = settings.servers.children().find { it.id == id }.username
password = settings.servers.children().find { it.id == id }.password
}
}
username = "myUsername"
password = "myPassword"
println("Username: $username")
println("Password: $password")
[username: username, password: password]
}()

为什么第一个代码块失败了,但硬编码可以工作?关于这些闭包的Groovy或Gradle行为,我有什么遗漏吗?

D'oh。发现问题。事实证明,这是我的settings.xml解析中的一个问题。用户名和密码是XML节点,而不是字符串。修复是:

username = settings.servers.children().find { it.id == id }.username.toString()
password = settings.servers.children().find { it.id == id }.password.toString()

最新更新