2013-10-25 1 views
14

특정 productFlavor 및 buildType을 gradle에 추가하는 방법을 궁금합니다. 예를 들어 productFlavor가 free이고 빌드 유형이 release 인 경우, assembleFreeRelease 작업에 종속성을 어떻게 추가 할 수 있습니까?특정 productFlavor 및 buildType에 종속성을 추가하십시오.

많은 변형을 시도했지만 어느 것도 작동하지 않습니다.

예를 들어 나는 시도 :

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

또는 :

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

여기에는 오류가 없지만 작업이 모든 맛에 대해 실행 및 유형, 매우 혼란을 구축됩니다.

답변

12

이 작업은 Android 플러그인 구성에 따라 동적으로 생성됩니다. 설정시에는 아직 사용할 수 없습니다. 작업 생성을 두 가지 방식으로 연기 할 수 있습니다.

project is evaluated까지 기다리십시오. 문자열로

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

Lazily declaring the task dependency.

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

맛 내기 및 buildType 종속성을 기본적으로 지원합니다.

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

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

+3

종속성 블록이 android 블록 뒤에있는 경우 –

+5

하지만 맛을 buildTypes와 어떻게 조합합니까? 예 : flavor1DebugCompile 또는 flavor1ReleaseCompile. 그것은 나를 위해 작동하지 않습니다 –

+0

이것을 작동 시키십시오? – Theyouthis

3

Muschko의 대답은 나를 위해 작동하지 않았다, 그래서 이것은 나를 here

만 특정에 실행해야하는 작업을 정의에 의해 작성 및 게시 내 솔루션입니다 buildType/변형/풍미

task doSomethingOnWhenBuildProductionRelease << { 
    //code 
} 

"< < "구문을 사용하십시오. 그렇지 않으면 작업이 매번 자동으로 호출됩니다. 작업이 솔직히

Gradle을
tasks.whenTaskAdded { task -> 
    if (task.name == 'assembleProductionRelease') { 
     task.dependsOn doSomethingOnWhenBuildProductionRelease 
    } 
} 
0
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) 역효과 수 있습니다 컴파일 TAKS의 이름을 생성하는 데 사용되는 로케일하지 않습니다.

5

android gradle plugin 및 gradle 2의 버전 1처럼 보입니다.2+, 당신은 구성이 작업을 수행 할 수 있습니다

configurations { 
    freeReleaseCompile 
} 

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

dependencies { 
    freeReleaseCompile('[email protected]') 
} 

참조 :

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

여기

관련 문제