Gradle全局变量在buildscript范围内不可用

12
我在顶层的build.gradle文件中有类似这样的内容(Gradle 2.2)。
ext.repo = "https://my-artifactory-repo"

buildscript {
    repositories {
        maven {
            credentials {
                username foo
                password bar
            }
            url repo //doesn't work
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.14.1'

    }
}

allprojects {
    repositories {
        maven {
            credentials {
                username foo
                password bar
            }
            url repo //works
        }
    }
}

这是错误信息。
Could not find property 'repo' on org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository_Decorated@718afa64.

所以它在allprojects中有效,但在buildscript中无效。
2个回答

12

您可以在buildscript {...}中使用ext将变量定义为额外属性。然后,该变量也可以在allprojects {...}范围内访问:

buildscript {
    ext {
        repo = "https://my-artifactory-repo"
    }
    repositories {
        maven {
            url repo // works
        }
    }
}

allprojects {
    repositories {
        maven {
            url repo // works
        }
    }
}

9
这是因为buildscript {...}配置闭包总是首先被评估,所以属性还未定义。一个解决方法是在构建脚本外定义该属性,可以将其放在gradle.properties文件中或通过命令行设置。

1
听起来像是疏忽。 - Bob
1
很遗憾,这是一个生命周期问题。buildscript闭包必须在脚本中的所有其他内容之前进行评估,因为它设置了执行脚本时使用的类路径。 - Mark Vieira
你还可以将属性定义移动到buildscript中,它将在“全局”范围内可用。这对我很有用,但我只有一个buildsript配置,不知道它在多个配置下如何工作。 - d370urn3ur
1
@MarkVieira 我把我的属性放在了 gradle.properties 里面,但仍然出现这个错误。 - IgorGanapolsky
对我来说,gradle.properties 不是设置这种类型变量的好地方。我最终做的是在 buildscript 中添加变量,并从那里使用它们。例如: buildscript { ext.dependency_version = "..." } dependencies { compile("groupId:artifactId:$dependency_version") } - camposer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接