2015-05-17 3 views
1

Существует два разных варианта объявления задачи в Gradle.Понимание различных вариантов объявления задачи в Gradle

1.

task myTask() {} 

2.

task task3 << {} 

Чтобы проверить, как они ведут себя, I've создал образец андроида проект

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.android.gradletest" 
     minSdkVersion 15 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.1.1' 
} 



task task1() { 
    println "Task 1" 
} 

task task2() { 
    println "Task 2" 
} 

task task3 << { 
    println "Task 3" 
} 

task task4() { 
    println "Task 4" 
} 

Первая попытка была затрачена на выполнение задачи 1

Task 1 
Task 2 
Task 4 
:app:task1 UP-TO-DATE 

BUILD SUCCESSFUL 

Total time: 6.462 secs 

Process finished with exit code 0 

Как вы видите, не только лишь Задача 1 выполняется, но полная сборка БЕЗ Задача 3.

Вторая попытка был запущен Задача 3 непосредственно:

Task 1 
Task 2 
Task 4 
:app:task3 
Task 3 

BUILD SUCCESSFUL 

Total time: 6.577 secs 

Process finished with exit code 0 

Результат снова, кажется, что полная сборка запускается, но на этот раз с задачей 3 в конце.

Третья попытка просто строить полный проект, нажав на кнопку запуска в Android Studio

Task 1 
Task 2 
Task 4 
:app:preBuild UP-TO-DATE 
:app:preDebugBuild UP-TO-DATE 
:app:checkDebugManifest 
:app:preReleaseBuild UP-TO-DATE 
:app:prepareComAndroidSupportAppcompatV72211Library UP-TO-DATE 
:app:prepareComAndroidSupportSupportV42211Library UP-TO-DATE 
:app:prepareDebugDependencies 
:app:compileDebugAidl UP-TO-DATE 
:app:compileDebugRenderscript UP-TO-DATE 
:app:generateDebugBuildConfig UP-TO-DATE 
:app:generateDebugAssets UP-TO-DATE 
:app:mergeDebugAssets UP-TO-DATE 
:app:generateDebugResValues UP-TO-DATE 
:app:generateDebugResources UP-TO-DATE 
:app:mergeDebugResources UP-TO-DATE 
:app:processDebugManifest UP-TO-DATE 
:app:processDebugResources UP-TO-DATE 
:app:generateDebugSources UP-TO-DATE 
:app:processDebugJavaRes UP-TO-DATE 
:app:compileDebugJava 
Note: Recompile with -Xlint:deprecation for details. 
:app:compileDebugNdk UP-TO-DATE 
:app:compileDebugSources 
:app:preDexDebug 
:app:dexDebug 
:app:validateDebugSigning 
:app:packageDebug 
:app:zipalignDebug 
:app:assembleDebug 
Information:BUILD SUCCESSFUL 

Как вы можете видеть, все получает срабатывает, кроме задачи 3!

Теперь у меня есть два вопроса:

  1. Что такое < < задача декларации Мент для, когда мы aren't в состоянии запустить его автономный и не запускается в процессе сборки?
  2. Почему он запускает несколько задач, когда я выполняю только одно из меню задач и как я могу выполнить только один? enter image description here

ответ

1

Gradle сборка проходит через 3 фазы:

  1. Initialization - определить, какие проекты собираются принять участие в сборке и создает экземпляр проекта для каждого из этих проектов.
  2. Конфигурация - сконфигурировать объекты проекта и, в частности, задачи, которые необходимо выполнить.
  3. Выполнение - выполнение подмножества задач, созданных и настроенных на этапе конфигурации.

Теперь, определение задачи состоит из 3 этапов:

task myTask { 
    // Configuration scope 
    // will be executed during the configuration phase 

    doFirst { 
     // Will be executed during the execution phase before the task defined behavior 
    } 

    doLast { 
     // Will be executed during the execution phase after the task defined behavior 
    } 
} 

Итак, когда вы определяете задачу так:

task task1() { 
    println "Task 1" 
} 

Поскольку println заявление является частью сферы конфигурации она будет выполняться на этапе конфигурации, независимо от того, была ли эта задача выбрана для выполнения или нет.

Теперь, используя оператор << для определения задачи на самом деле ярлык для определения doLast закрытия для выполнения этой задачи, т.е.

task task3 << { 
    println "Task 3" 
} 

эквивалентно:

task task3 { 
    doLast { 
     println "Task 3" 
    } 
} 

Тогда на мой объяснение выше, в этом случае оператор println будет выполняться только во время фазы выполнения, в случае, если task3 должен быть выполнен, как было определено на этапе конфигурации.

Если вы заинтересованы, чтобы узнать больше об этом, я очень рекомендую вам пройти через следующие разделы в Gradle руководстве пользователя:

  1. Build Script Basics
  2. The Build Lifecycle
Смежные вопросы