Android Gradle:带有变量的项目依赖关系

Android Gradle:带有变量的项目依赖关系,android,gradle,dependencies,Android,Gradle,Dependencies,我有一个gradle脚本,需要作为依赖项导入,如下所示: compile project(':subproject', { ext.app = 'myApp'; ext.serverUrl = 'https://example.com'; ext.system = 'LIVE'}) 如果我直接在dependency语句中设置变量,这就可以了 由于我有一个用于调试和发布的不同系统,我尝试将这些属性移动到buildTypes: ... debug { debuggable

我有一个gradle脚本,需要作为依赖项导入,如下所示:

compile project(':subproject', { ext.app = 'myApp'; ext.serverUrl = 'https://example.com'; ext.system = 'LIVE'})
如果我直接在dependency语句中设置变量,这就可以了

由于我有一个用于调试和发布的不同系统,我尝试将这些属性移动到buildTypes:

...
    debug {
        debuggable true
        serverUrl = 'https://example.com'
        system = 'TEST'
    }
    prerelease {
        debuggable true
        serverUrl = 'https://example.com'
        system = 'STAGING'
    }
    release {
        serverUrl = 'https://example.com'
        system = 'LIVE'
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
...


dependencies {
    compile project(':subproject', { ext.app = appName; ext.serverUrl = serverUrl; ext.system = system })
}
因此,当我构建
assembleDebug
时,它应该使用
TEST
,使用
assembleRelease
它应该使用
STAGING
。然而,它总是使用发布版本类型变量来编译依赖项

该库已包含
publishNonDefault true


这个渐变脚本怎么了?

我回答我自己的问题

Gradle未按预期分析Gradle文件。在生成任务时,将在单个步骤中评估闭包。这意味着不存在只有在执行特定任务时才会使用的变量的概念。文件被读取一次,这会导致变量覆盖另一个风格或构建类型的先前值。这也是为什么改变口味顺序会产生不同值的原因

正确的解决方案是定义一个自定义任务,该任务在生成文件后立即运行。该任务将为应用程序的每个变体生成一组任务,这些变体本身包含要执行的配置


这篇文章对我帮助很大:

我回答了我自己的问题

Gradle未按预期分析Gradle文件。在生成任务时,将在单个步骤中评估闭包。这意味着不存在只有在执行特定任务时才会使用的变量的概念。文件被读取一次,这会导致变量覆盖另一个风格或构建类型的先前值。这也是为什么改变口味顺序会产生不同值的原因

正确的解决方案是定义一个自定义任务,该任务在生成文件后立即运行。该任务将为应用程序的每个变体生成一组任务,这些变体本身包含要执行的配置


这篇SO文章对我帮助很大:

在我看来,gradle总是将最后一个值放入扩展中。如何从其他构建类型获取定义?也许有一个循环?在我看来,gradle总是把最后的值放入扩展中。如何从其他构建类型获取定义?也许是打个圈?