15

我想知道如何在 gradle 中添加对特定 productFlavor 和 buildType 的依赖。例如我有 productFlavorfree和 build type release,如何添加对assembleFreeRelease任务的依赖?

我尝试了许多变体,但都不起作用。

例如我试过:

task('release', dependsOn: assembleProductionRelease) {
} 
// error: Could not find property 'assembleProductionRelease' on root project 'app'.

或者:

task('release', dependsOn: 'assembleProductionRelease') {
}

这里没有错误,但任务是针对每种风格和构建类型执行的,非常令人困惑。

4

7 回答 7

16

有对风味和 buildType 依赖项的内置支持。

dependencies {
   flavor1Compile "..."
   freeReleaseCompile "..."
}

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Sourcesets-and-Dependencies

于 2013-10-27T12:13:10.433 回答
13

这些任务是根据您的 Android 插件配置动态生成的。在配置时,您还不能使用它们。您可以通过两种方式推迟创建任务:

等到项目评估完毕

afterEvaluate {
    task yourTask(dependsOn: assembleFreeRelease) {
        println "Your task"
    }
}

懒惰地将任务依赖声明为字符串。

task yourTask(dependsOn: 'assembleFreeRelease') {
    println "Your task"
}
于 2013-10-25T20:19:23.213 回答
8

看起来现在在 android gradle 插件的版本 1 和 gradle 2.2+ 中,您可以通过配置执行此操作:

configurations {
  freeReleaseCompile
}

android {
   ...
  productFlavors {
    free {
      ...
    }
  }
}

dependencies {
  freeReleaseCompile('myLib@aar')
}

参考:https ://groups.google.com/forum/#!msg/adt-dev/E2H_rNyO6-o/h-zFJso-ncoJ

于 2015-03-11T17:38:05.640 回答
3

Muschko 的回答对我不起作用,所以这是我的解决方案,由我在这里编写和发布

定义只应在特定 buildType/variant/flavor 上执行的任务

task doSomethingOnWhenBuildProductionRelease << {
    //code
}

使用“<<”语法很重要,否则每次都会自动调用该任务。

gradle添加任务时动态设置依赖

tasks.whenTaskAdded { task ->
    if (task.name == 'assembleProductionRelease') {
        task.dependsOn doSomethingOnWhenBuildProductionRelease 
    }
}
于 2014-03-30T12:00:52.683 回答
1
android {
    ext.addDependency = {
        task, flavor, dependency ->
            def taskName = task.name.toLowerCase(Locale.US)
            if (taskName.indexOf(flavor.toLowerCase(Locale.US)) >= 0) {
                task.dependsOn dependency
            }
    }

    productFlavors {
        production {
        }
        other
    }

    task theProductionTask << {
        println('only in production')
    }

    tasks.withType(JavaCompile) {
        compileTask -> addDependency compileTask, "production", theProductionTask
    }
}

坦率地说,我不知道使用哪个语言环境来生成编译任务的名称,因此toLowerCase(Locale.US)可能会适得其反。

于 2014-12-02T09:34:44.883 回答
0

以上所有答案都对我有帮助,但我最终需要在编译每种风味的调试 + 发布版本之前运行一个脚本。脚本的第一个参数采用风味名称。

为了尽早触发此触发器,但在创建特定风味任务之后,关键是将dependsOn 绑定到generateMyflavorDebugBuildConfig。

这是我最终得到的脚本,可以放在 app/build.gradle 的底部

// When a task is active, loop through all app flavors, and see if the 
// task.name matches the earliest task we can set up the dependsOn

// loop through all flavors, and create a task that does the work we want to do 
// before anything else
android.productFlavors.all { flavor ->
    task("${flavor.name}RunCommandBefore", type: Exec) {
        workingDir "$projectDir/../.."
        commandLine 'sh', 'scripts/run_thing.sh', "${flavor.name}"
    }
}

// when tasks created, loop through and as early as we can, bind the 
// RunCommandBefore task we created above
tasks.whenTaskAdded { task ->
    def taskName = task.name
    // loop through all flavors
    android.productFlavors.all { flavor ->
        def flavorName = flavor.name 
        // loop through release types so that this happens for debug and release
        ['debug', 'release'].each { releaseType -> 
            // generateMyflavorDebugBuildConfig is the earliest task we're able  
            // to set up the dependsOn to make sure that our script runs 
            if (taskName.toLowerCase() == "generate${flavorName.toLowerCase()}${releaseType}buildconfig") {
                // now myflavorRunCommandBefore will run before 
                // generateMyflavorDebugBuildConfig
                tasks."$taskName".dependsOn "${flavorName}RunCommandBefore"
            }
        }
    }
}

希望这对某人有帮助!令人惊讶的是,Android 首先运行一个简单的脚本是多么困难......

于 2021-05-21T14:50:31.897 回答
0

这是我使用的另一种方式:

tasks.withType(JavaCompile) {  
    compileTask ->  
    def dependedTaskName = "dependedTask_";  
    if(compileTask.name.contains('Release') {  
      dependedTaskName += "Release";  
    }  
    createTask(dependedTaskName, Exec) {  
     ........  
    }  

    compileTask.dependsOn ndkBuildTaskName  
}  

另一种方式:

tasks.whenTaskAdded { task ->  
    if (task.name == 'generateReleaseBuildTypeBuildConfig') {  
        task.dependsOn doSomethingForReleaseBuild   
    }  
}   

第一种方法是动态的,而第二种方法更简单。

于 2016-11-14T18:32:43.347 回答