我已经构建了一个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。
答案 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'
}
}