无法获得未知财产' repositoryUrl'对于项目

时间:2017-05-14 18:32:19

标签: android android-studio gradle react-native android-gradle

我有一个使用React-Native的项目。我building the RN module from source,所以我的项目将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'
        ...
    }
}

此更改迫使我将gradle本身从3.1升级到3.5(最新稳定版)。

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

  

无法获取未知财产' repositoryUrl'对于项目   ':ReactAndroid'类型为org.gradle.api.Project。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:16)

嗯,结果很有趣。

原因

错误指向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()会在属性确实丢失但仍有吸气剂的情况下返回true。在我们的例子中,getter是

def getRepositoryUrl() {...}

here进行了含糊的解释。

然而,还有另一种检查属性的方法,它忽略了名为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') : ''
}

对此:

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模块时遇到更多麻烦。

答案 1 :(得分:0)

使用项目的功能 hasProperty 可能更好。
如下所示:

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

def getRepositoryUsername() {
    return project.hasProperty('repositoryUsername') ? property('repositoryUsername') : ''
}

def getRepositoryPassword() {
    return project.hasProperty('repositoryPassword') ? property('repositoryPassword') : ''
}

问题是由gradle从2.x升级到3.x引起的。因此,我发现更高版本的react-native(例如0.57.4)在ReactAndroid / release.gradle中具有上述脚本,并且可以正常工作。