无法为项目获取未知属性'repositoryUrl'

Vai*_*den 7 android gradle android-studio android-gradle-plugin react-native

我有一个使用React-Native的项目.我正在从源代码构建RN模块,因此我的项目将ReactAndroid模块作为依赖项.

我试图将项目升级到Android gradle构建工具> = 2.3.2,所以我可以使用intant-run:

buildscript {
    repositories {
        jcenter()
        mavenLocal()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这一变化迫使我将gradle本身从3.1升级到3.5(最新稳定).

构建项目会突然产生以下gradle错误

无法为org.gradle.api.Project类型的项目':ReactAndroid'获取未知属性'repositoryUrl'.

有人可以帮忙吗?

Vai*_*den 16

好吧,结果很有趣.

原因

错误指向React-Native模块的这一行release.gradle:

def getRepositoryUrl() {
    return hasProperty('repositoryUrl')  ? property('repositoryUrl') : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,问题在于hasProperty('repositoryUrl')返回true,同时property('repositoryUrl')导致错误.

在gradle 3.1上,hasProperty('repositoryUrl')返回false.

显然在gradle 3.5中,在物业确实缺失但仍有吸气剂的情况下hasProperty()返回true.在我们的例子中,吸气剂是

def getRepositoryUrl() {...}
Run Code Online (Sandbox Code Playgroud)

这里含糊不清地解释这一点.

然而,还有另一种检查属性的方法,它忽略了名为findProperty的 getter .

修复

所以解决方法是更改​​以下块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') : ''
}
Run Code Online (Sandbox Code Playgroud)

对此:

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') : ''
}
Run Code Online (Sandbox Code Playgroud)

在这里从源代码构建RN模块时遇到了更多的麻烦.