【问题标题】:Could not get unknown property 'repositoryUrl' for project无法获取项目的未知属性“repositoryUrl”
【发布时间】:2017-10-13 12:43:22
【问题描述】:

我有一个使用 React-Native 的项目。我是building the RN module from source,所以我的项目有 ReactAndroid 模块作为依赖项。

我正在尝试将项目升级到 Android gradle build tools >=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” org.gradle.api.Project 类型的“:ReactAndroid”。

谁能帮忙?

【问题讨论】:

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


    【解决方案1】:

    嗯,结果很有趣。

    原因

    错误指向 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 模块时经历了更多痛苦。

    【讨论】:

      【解决方案2】:

      也许改用项目的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 中有上面的脚本,它可以工作。

      【讨论】:

        猜你喜欢
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        相关资源
        最近更新 更多