Подтвердить что ты не робот

В Android/Gradle как определить задачу, которая выполняется только при построении определенного типа buildType/buildVariant/productFlavor (v0.10 +)

Плагин Android для Gradle создает для каждой задачи BuilType/Flavor/BuildVariant задачу. Проблема в том, что эта задача будет генерироваться динамически и, таким образом, не будет доступна как зависимость при определении такой задачи:

task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
    //do smth
}

Предлагаемое обходное решение из этого будет таким

task myTaskOnlyForDebugBuildType(dependsOn:"assembleDebug") {
    //do smth
}

или

afterEvaluate {
    task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
        //do smth
    }
}

Но оба не работали для меня.

4b9b3361

Ответ 1

Вот полный пример того, как это сделать вдохновленный этим сообщением: (плагин android v.0.9.2 и gradle 1.11 на момент написания)

Мы собираемся определить задачу, которая выполняется только тогда, когда мы создаем "debugCustomBuildType"

android {
    ...
    buildTypes {
        debugCustomBuildType {
            //config
        }
   }
}

Определите задачу, которая должна выполняться только по определенному встроенному типу/варианту/вкусу

task doSomethingOnWhenBuildDebugCustom {
    doLast {
       //task action
    }
}

Динамически устанавливать зависимость при добавлении задач с помощью gradle

tasks.whenTaskAdded { task ->
    if (task.name == 'generateDebugCustomBuildTypeBuildConfig') {
        task.dependsOn doSomethingOnWhenBuildDebugCustom 
    }
}

Здесь мы используем задачу "generateBuildConfig", но вы можете использовать любую задачу, которая работает для вас (также см. официальные документы)

  • processManifest
  • aidlCompile
  • renderscriptCompile
  • mergeResourcess.
  • mergeAssets
  • processResources
  • generateBuildConfig
  • javaCompile
  • processJavaResources
  • собрать

Не забудьте использовать задачу buildTypeSpecific (generateBuildConfig vs. generateDebugCustomBuildTypeBuildConfig)

И что это. Это позор, это обходное решение недостаточно хорошо документировано, потому что для меня это похоже на один из самых простых требований для сборки script.

Ответ 2

Я достиг этого следующим образом:

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
    }
}

Чтобы быть откровенным, я не знаю, какой язык используется для генерации имен для компиляции taks, поэтому toLowerCase(Locale.US) может быть контрпродуктивным.

Ответ 3

tasks.whenTaskAdded { task ->
    if (task.name.contains("assembleRelease")) {
        task.getDependsOn().add({
            // add your logic here
        })
    }
}

Ответ 4

Это единственное решение, которое сработало для меня:

afterEvaluate {
    if (project.hasProperty("preReleaseBuild")){
        tasks.preReleaseBuild.dependsOn bundleJSRelease
    } else {
        tasks.preDebugBuild.dependsOn bundleJSDebug
    }
}