即使它属于不同的构建变体,也会执行函数吗?

时间:2017-05-02 10:57:13

标签: gradle android-gradle

我的设置:

  • buildToolsVersion“25.0.3”
  • com.android.tools.build:gradle:2.3.0

代码:

apply plugin: 'com.android.application'
android {

    // ...

    signingConfigs {
        release {
            storeFile getReleaseKeyStoreFile()
     // ...    

     File getReleaseKeyStoreFile() {
         String keyStoreFile = System.getenv("KEYSTORE_FILE")
         if (keyStoreFile == null || keyStoreFile == "") {
             println 'ERROR: Failed getting release keyStoreFile'
             return null
     }
     return file(keyStoreFile)
}

当我运行gradle任务assembleDebug时,我在Gradle构建消息中得到了这个:

Failed getting releaseKeyStoreFile

  1. 为什么即使构建变体是debug而不是release,也会评估此函数?
  2. 是否有一个简单的解决办法来避免这种不必要的行为?

1 个答案:

答案 0 :(得分:1)

您需要区分配置阶段执行阶段

配置阶段中,将评估并执行整个构建脚本。 只有任务操作(由任务类型定义),doFirstdoLast闭包在执行阶段中执行。

任务是执行的(显式的还是依赖的)只会影响执行阶段,但它始终会被配置。

您可以调用每项任务,android关闭中的配置代码将始终执行。

回答你的第二个问题:你的方法必须是自动防故障的(就像现在一样)。将null返回到storeFile属性没有问题,因为只有任务(未执行)才会失败。

附加提示:您可以简化方法。无需检查null 是否为空字符串,您只需检查Groovy的真相即可。您也可以使用三元表达式。

return keyStoreFile ? file(keyStoreFile) : null