Gradle:项目与变量的依赖关系

时间:2016-10-14 11:44:02

标签: android gradle dependencies

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

compile project(':subproject', { ext.app = 'myApp'; ext.serverUrl = 'https://example.com'; ext.system = 'LIVE'})

如果我直接在依赖语句中设置变量,这工作正常。

由于我有一个不同的系统用于调试和发布,我试图将这些属性移动到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,使用assemblePrerelease时,应使用STAGING。但是,它始终使用发布构建类型变量来编译依赖项。

该库已包含publishNonDefault true

这个gradle脚本有什么问题?

1 个答案:

答案 0 :(得分:0)

我回答我自己的问题。

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

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

这篇SO文章帮助了我很多:How to get current buildType in Android Gradle configuration