2014-11-12 19 views
6

Ben fonksiyonları var uzun build.gradle dosya var Ben mantık temizlemek için ayrı .gradle dosya taşımak istiyorum. Dokümanlar bu vaka için external build scripts kullanılmasını önerir. o build.gradle dosyasına yerleştirildiğinde kod mantığı, bu iyi çalışıyor fark etmezBuild.gradle mantığını daha .grad dosyaları nasıl bölerim?

android{ 
    buildTypes { 
    debug { 
     signingConfig = loadFromPropertiesFile("DEBUG_KEY_PROPERTIES") 
    } 
    } 
} 

import com.android.builder.signing.DefaultSigningConfig 
import com.android.builder.model.SigningConfig 

SigningConfig loadFromPropertiesFile(keyProperty) { 
    // Load signing config from singning properties file 
    println keyProperty 
    println ("${keyProperty}") 
    if (project.hasProperty(keyProperty)) { 
     File releasePropsFile = new File(project.property(keyProperty)) 
     println("Loading config from properties file: ${releasePropsFile}") 
     if (releasePropsFile.exists()) { 
      Properties releaseProps = new Properties() 
      releaseProps.load(new FileInputStream(releasePropsFile)) 
      println releaseProps 

      def signingConfig = new DefaultSigningConfig(keyProperty) 
      signingConfig.storeFile = file(releasePropsFile.getParent() + "/" + releaseProps['keystore.file']) 
      signingConfig.storePassword = releaseProps['keystore.password'] 
      //signingConfig.storeType = 'PKCS12' 
      signingConfig.keyAlias = releaseProps['alias.name'] 
      signingConfig.keyPassword = releaseProps['alias.password'] 
      return signingConfig 
     } else { 
      println("Can't read configuration file: ${releasePropsFile}") 
      return null 
     } 
    } else { 
     println("Project has not define configuration file: ${keyProperty}") 
     return null 
    } 
} 

: Ben build.gradle dosyanın sonraki fonksiyonu var. Önümüzdeki hata var

apply from: "$rootDir/gradle/android-signing.gradle"

:

Cannot cast object 'DefaultSigningConfig{..}' with class 
com.android.builder.signing.DefaultSigningConfig' to class 
'com.android.builder.model.SigningConfig' 

Temelde bunun arayüzüne uygulanmasını döküm olamayacağını söylüyor ben harici dosyaya bu yöntemi taşımak ve onu eklediğinizde Ama başarısız . DefaultSigningConfig, SigningConfig see here uyguladığı için. Sonraki answer'u görene kadar mantıklı değil.

Two classes are treated as entirely different classes, even if they have the same package and name (and even implementation/fields/methods) when loaded by different classloaders. Which is the case when you are using plugin or external build script.

Ama sonra modüler ayrı dosyalar halinde build.gradle gelen yöntemler bölmek nasıl?

+0

Eğer itibaren geçerli kullanıyorsunuz zaman:? Sadece loadFromPropertiesFile yöntemini tanımlar mısınız? android {} yan tümcesi ve kullanmak istediğiniz göreceli sınıfları kullanmak istiyorsanız, uygulamadan ÖNCE android eklentiyi uyguladığınızdan emin olmalısınız! Uygula, temel olarak, tanımlanmışsa yerel değişkenlerin aktarılmadığı durumlar haricindedir. – codeScriber

+0

@Sergii Pechenizkyi Hiç bir işe mi çalışıyorsun? –

cevap

0

(teşekkürler, opensource!) O android eklentisi DSL api ayarlayıcı SigningConfig arayüzünü almasına izin fakat internal.dsl.SigningConfig sınıfa döküm için toplama maddesinin zorlayarak tutarsız bulduk.

Yani böyle olmalı:

package com.android.builder.core; 

import com.android.builder.internal.BaseConfigImpl; 
import com.android.builder.model.BuildType; 
import com.android.builder.model.SigningConfig; 

public class DefaultBuildType extends BaseConfigImpl implements BuildType { 

    ... 

    public BuildType setSigningConfig(SigningConfig signingConfig) { 
     mSigningConfig = signingConfig; 
     return this; 
    } 

    @Override 
    public SigningConfig getSigningConfig() { 
     return mSigningConfig; 
    } 
} 

Ama sonra SigningConfigDSL sınıfına BuiltTypeDSL kuvvet dökme:

package com.android.build.gradle.internal.dsl 

import com.android.builder.core.DefaultBuildType 

/** 
* DSL object to configure build types. 
*/ 
public class BuildType extends DefaultBuildType implements Serializable { 

    ... 

    /** The signing configuration. */ 
    @Override 
    SigningConfig getSigningConfig() { 
     return (SigningConfig) super.signingConfig 
    } 
} 

Not, aynı adla SigningConfig ancak farklı paket adıyla birlikte dönüş türü getSigningConfig() iki yöntem . Bir arayüz com.android.builder.model.SigningConfig olduğu ve diğerinin de com.android.builder.model.SigningConfig uygular com.android.builder.signing.DefaultSigningConfig uzanır com.android.build.gradle.internal.dsl.SigningConfig ve benim kod nedeniyle OOP prensiplerine biz SigningConfig arayüzüne DefaultSigningConfig döküm, çünkü çalışma durdurulur, ancak internal.dsl.SigningConfig sınıfa döküm olamaz orası.

import com.android.build.gradle.internal.dsl.SigningConfig 

def signingConfig = new SigningConfig(keyProperty) // note that this is class which extends DefaultSigningConfig, not interface 
signingConfig.storeFile = ... // same as before 
signingConfig.storePassword = ... 
signingConfig.keyAlias = ... 
signingConfig.keyPassword = ... 
return signingConfig 

veya dahili DSL modeli ile DefaultSigningConfig sarın:

kod çalışma yapmak için, internal.dsl.SigningConfig yerine DefaultSigningConfig oluşturabilir ya

android{ 
    signingConfigs { 
     debug { 
      initWith loadFromPropertiesFile("DEBUG_KEY_PROPERTIES") 
     } 
    } 

    buildTypes { 
    debug { 
     signingConfig signingConfigs.debug 
    } 
    } 
}