嗯,结果很有趣。
原因
错误指向 React-Native 模块的 release.gradle 处的这一行:
def getRepositoryUrl() {
return hasProperty('repositoryUrl') ? property('repositoryUrl') : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
}
奇怪的是,问题在于hasProperty('repositoryUrl') 返回true,而property('repositoryUrl') 导致错误。
在 gradle 3.1 上,hasProperty('repositoryUrl') 返回 false。
显然在 gradle 3.5 中,hasProperty() 在属性确实缺失但仍有 getter 的情况下返回 true。在我们的例子中,getter 是
def getRepositoryUrl() {...}
这个解释模糊了here。
然而,还有另一种检查属性的方法,它忽略了 getter,名为 findProperty。
修复
所以解决方法是从 release.gradle 更改以下块:
def getRepositoryUrl() {
return hasProperty('repositoryUrl') ? property('repositoryUrl') : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
}
def getRepositoryUsername() {
return hasProperty('repositoryUsername') ? property('repositoryUsername') : ''
}
def getRepositoryPassword() {
return hasProperty('repositoryPassword') ? property('repositoryPassword') : ''
}
到这里:
def getRepositoryUrl() {
return findProperty('repositoryUrl') != null ? property('repositoryUrl') : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
}
def getRepositoryUsername() {
return findProperty('repositoryUsername') !=null ? property('repositoryUsername') : ''
}
def getRepositoryPassword() {
return findProperty('repositoryPassword') != null ? property('repositoryPassword') : ''
}
从源代码here 构建 RN 模块时经历了更多痛苦。