2015-05-20 13 views
28

Tôi có 2 hương vị, cho phép nói Vanilla và Chocolate. Tôi cũng có các kiểu xây dựng Gỡ lỗi và Phát hành, và tôi cần Vanilla Release để có trường đúng, trong khi 3 kết hợp khác phải là sai.Xác định buildconfigfield cho một hương vị cụ thể VÀ buildType

def BOOLEAN = "boolean" 
def VARIABLE = "VARIABLE" 
def TRUE = "true" 
def FALSE = "false" 

    VANILLA { 

     debug { 

      buildConfigField BOOLEAN, VARIABLE, FALSE 

     } 

     release { 

      buildConfigField BOOLEAN, VARIABLE, TRUE 

     } 


    } 

    CHOCOLATE { 
     buildConfigField BOOLEAN, VARIABLE, FALSE 
    } 

Tôi gặp lỗi, vì vậy tôi đoán mẹo gỡ lỗi và phát hành không hoạt động. Có thể làm điều này?

+0

tại sao bạn lại định boolean, đúng và sai ... –

+1

Tôi thích sử dụng BOOLEAN, TRUE và FALSE thay vì "boolean", "true" và "false". Tuy nhiên không liên quan gì đến câu hỏi – JesusS

+0

Xem câu trả lời này: http://stackoverflow.com/a/26579662/10793 – Muxa

Trả lời

61

Vòng các biến thể và kiểm tra tên của họ:

productFlavors { 
    vanilla {} 
    chocolate {} 
} 

applicationVariants.all { variant -> 
    println("Iterating variant: " + variant.getName()) 
    if (variant.getName() == "chocolateDebug") { 
     variant.buildConfigField "boolean", "VARIABLE", "true" 
    } else { 
     variant.buildConfigField "boolean", "VARIABLE", "false" 
    } 
} 
+0

Cảm ơn rất nhiều! Tôi vẫn phải chờ đợi để tặng tiền thưởng cho đến ngày mai – JesusS

+0

Giải pháp này có một thiếu - bạn sử dụng các chuỗi để xác định một biến thể xây dựng. Trong trường hợp một số lượng lớn các buildConfigFields bạn sẽ có một mã soạn sẵn. Và bạn cũng không nên quên kiểm tra chính xác sau khi đổi tên buildType hoặc productFlavor –

+0

Giải pháp được thêm https://stackoverflow.com/a/47199250/1228514 –

4

Trong hệ thống xây dựng Gradle, buildTypesproductFlavors không may là hai thực thể riêng biệt.

Theo như tôi biết, để hoàn thành những gì bạn muốn đạt được, bạn sẽ cần phải tạo ra một xây dựng hương vị như vậy:

buildTypes { 
     debug{} 
     release {} 
    } 

    productFlavors { 
     vanillaDebug { 
      buildConfigField BOOLEAN, VARIABLE, FALSE 
     } 
     vanillaRelease { 
      buildConfigField BOOLEAN, VARIABLE, TRUE 
     } 
     chocolate { 
      buildConfigField BOOLEAN, VARIABLE, FALSE 
     } 
    } 
+2

Cảm ơn câu trả lời, đó là điều tôi sợ. Với cách tiếp cận này tôi sẽ có 6 bản dựng khác nhau, đúng không? vanillaDebugDebug, vanillaDebugRelease, vanillaReleaseDebug, vanillaReleaseRelease, chocolateDebug, chocolateRelease right? Tôi nghĩ rằng giải pháp này không phù hợp với nhu cầu của tôi nhưng tôi đoán không có giải pháp tốt cho vấn đề – JesusS

+1

Nó không phải là lý tưởng tôi biết, nhưng đó là cách chính xác để làm điều đó tại hiện tại –

1

đây là cách tôi giải quyết này:

def GAME_DIMENSION = "game" 
def BUILD_DIMENSION = "building" 

flavorDimensions GAME_DIMENSION, BUILD_DIMENSION 

productFlavors { 
    lollipop { 
     dimension BUILD_DIMENSION 
     minSdkVersion 21 
    } 

    normal { 
     dimension BUILD_DIMENSION 
    } 

    game_1 { 
     dimension GAME_DIMENSION 
     ext { 
      fields = [ 
        [type: 'String', name: 'TESTSTRING', values: [debug: 'debugstring', release: 'releasestring']], 
        [type: 'int', name: 'TESTINT', values: [debug: '1234', release: '31337']] 
      ] 
     } 
    } 

    game_2 { 
     dimension GAME_DIMENSION 
     ext { 
      fields = [] // none for game_2 
     } 
    } 
} 

applicationVariants.all { variant -> 

    // get the GAME dimension flavor 
    def game = variant.getProductFlavors() 
      .findAll({ flavor -> flavor.dimension == GAME_DIMENSION}) 
      .get(0) 

    println "Adding " + game.ext.fields.size() + " custom buildConfigFields for flavor " + variant.name 

    // loop over the fields and make appropriate buildConfigField 
    game.ext.fields.each { field -> 
     def fldType = field['type'] 
     def fldName = field['name'] 
     def fldValues = field['values'] 

     // get debug/release specific value from values array 
     def fldSpecificValue = fldValues[variant.getBuildType().name] 

     // add quotes for strings 
     if (fldType == 'String') { 
      fldSpecificValue = '\"' + fldSpecificValue + '\"' 
     } 

     println " => " + fldType + " " + fldName + " = " + fldSpecificValue 
     variant.buildConfigField fldType, fldName, fldSpecificValue 
    } 
} 

(tôi vẫn chưa thể xác định có hay không t ext.fields tồn tại trên một hương vị)

-1
productFlavors { 
    vanilla {} 
    chocolate {} 
} 

buildTypes { 
     release { 
      productFlavors.vanilla { 
       //your configuration for vanilla flavor with release buildType 
      } 
     } 
     debug { 
      productFlavors.chocolate{ 
       //your configuration for chocolate flavor with debug buildType 
      } 
     } 
    } 
+1

Khi bạn làm điều này, Nó sẽ lấy định nghĩa cuối cùng bạn đặt. Vì vậy, trong trường hợp này, nó sẽ luôn biên dịch với debugCocolate. Khi bạn thay đổi thứ tự để vani được định nghĩa bên dưới sô cô la, nó sẽ luôn luôn có điều đó. Điều này rất có thể không phải là kết quả mong muốn. Mặc dù, nó sẽ được tốt đẹp nếu nó sẽ làm việc như thế này. – pl3kn0r

6

Đây là một giải pháp mà không thiếu các tôi đã mô tả dưới Simas answer

buildTypes { 
    debug {} 
    release {} 
} 

productFlavors { 
    vanilla { 
     ext { 
      variable = [debug: "vanilla-debug value", release: "vanilla-release value"] 
     } 
    } 
    chocolate { 
     ext { 
      variable = [debug: "chocolate-debug value", release: "chocolate-release value"] 
     } 
    } 
} 

applicationVariants.all { variant -> 
    def flavor = variant.productFlavors[0] 
    variant.buildConfigField "boolean", "VARIABLE", "\"${flavor.ext.variable[variant.buildType.name]}\"" 
} 
Các vấn đề liên quan