通过gradle中的任务更改依赖关系

时间:2016-09-20 15:32:43

标签: android gradle android-gradle

我已经构建了一个lib,为了编译应用程序需要设置特定的flavor和release / debug类型。 但是,在通过命令组装gradle时,我尝试使用systemProperty来执行此操作。

要做到这一点,我做这样的事情:

gradlew init assembleRelease -D P="flavor1"

在应用程序的build.gradle上,我创建了一个使用它的任务" P"系统属性如:

task init(type: JavaExec){
        systemProperty "Production", System.getProperty("P")   //this variable comes from command variable
        rootProject.ext.set("Production", systemProperties["Production"]);
}

尽管如此,以下代码始终在init任务之前运行:

dependencies{
   if(rootProject.ext.Production == "flavor1"){
      releaseCompile "compile with flavor1"
   }else{
      releaseCompile "compile with flavor2"
   }
}

有没有办法更改任务init的依赖关系,以便根据命令行上的系统属性设置的风格创建apk?

注意:我有一个应用程序,它添加了一个lib的依赖项,它有很多种类,我想通过命令行动态更改的依赖项是添加到应用这个lib。

1 个答案:

答案 0 :(得分:1)

嗯,你做的只是赌博。您同时执行这两项操作,stack的设置以及在配置阶段消耗rootProject.ext.Production。但是我不认为有一些保证会先按你宣布的方式执行。除此之外,使用rootProject.ext.Production任务配置阶段代码在项目上设置一些ext属性是完全无意义的。

而不是

JavaExec

简单地写

task init(type: JavaExec){
    systemProperty "Production", System.getProperty("P")   //this variable comes from command variable
    rootProject.ext.set("Production", systemProperties["Production"]);
}

dependencies{
   if(rootProject.ext.Production == "flavor1"){
      releaseCompile "compile with flavor1"
   }else{
      releaseCompile "compile with flavor2"
   }
}

或者如果你需要它作为变量在rootProject上,因为子项目需要在他们的构建文件中的值

dependencies{
   if(System.properties.P == 'flavor1'){
      releaseCompile 'compile with flavor1'
   }else{
      releaseCompile 'compile with flavor2'
   }
}

如果你只是需要在同一个构建文件中多次,一个局部变量也可以,不需要项目ext-property

rootProject.ext.Production = System.properties.P;

dependencies{
   if(rootProject.Production == 'flavor1'){
      releaseCompile 'compile with flavor1'
   }else{
      releaseCompile 'compile with flavor2'
   }
}

除此之外,我不会使用系统属性,而是使用项目属性 只需使用

def production = System.properties.P;

dependencies{
   if(production == 'flavor1'){
      releaseCompile 'compile with flavor1'
   }else{
      releaseCompile 'compile with flavor2'
   }
}

并使用dependencies{ if(production == 'flavor1'){ releaseCompile 'compile with flavor1' }else{ releaseCompile 'compile with flavor2' } }

进行调用