2013-09-03 32 views
16

Eklenti uzantı nesnesinde toplanan bilgilere göre project.dependencies'a bağımlılıklar ekleyen bir eklenti yazmaya çalışıyorum. Ama imkansız gibi görünüyor.Gradle özel eklentisi: eklenti nesnesinden bağımlılık ekle

Gerçekten de, uzantı nesnesindeki veriler yalnızca yeni bir görevde veya project.afterEvaluate kapamasında kullanılabilir, ancak bu yerlere eklenen bağımlılıklar dikkate alınmaz.


şu kod afterEvaluate yılında bağımlılık eklemeye çalışır ancak bağımlılık göz ardı edilir: bağımlılık enjeksiyon işleri Aşağıdaki kodda

apply plugin: MyPlugin 

myplugin { 
    version '1.0' 
} 

class MyPlugin implements Plugin<Project> { 
    void apply(Project project) { 
    project.extensions.create('myplugin', MyPluginExtension) 

    project.afterEvaluate { 
     def version = project.myplugin.version 
     project.dependencies.add("compile", "org.foo:bar:$version") // --> ignored 
    } 
    } 
} 

class MyPluginExtension { 
    def version 
} 

ama erişimi yok uzantı nesnesi:

apply plugin: MyPlugin 

myplugin { 
    version '1.0' 
} 

class MyPlugin implements Plugin<Project> { 
    void apply(Project project) { 
    project.extensions.create('myplugin', MyPluginExtension)  

    def version = project.myplugin.version // == null 
    project.dependencies.add("compile", "org.foo:bar:$version") // --> fail because $version is null 

    } 
} 

class MyPluginExtension { 
    def version 
} 

Çözüm var mı? O hâlâ alakalı eğer

+1

tek bir ya da bu şekilde, uzatma erişen ertelemek gerekecek. Bana 'project.afterEvaluate' bağımlılıkları eklemek neden işe yaramaz bana açık değil. Eklentiyi kullanan kodla ilgili bir sorun olabilir. –

+0

Teşekkürler, temiz kalmak için kodu sadeleştirdim, tüm kodu [burada bulabilirsiniz] (https://github.com/tbruyelle/ResetUnreadSms/blob/aa-plugin/build.gradle). Ek açıklamalardan java sınıfları üreten bir kütüphane için bir android eklentidir. Eklenti, uzantı nesnesi olmaksızın iyi çalışır, ancak bağımlılıkların söz konusu açıklandığı gibi, uzantı nesnelerinden veri ile enjekte edilmesi durumunda başarısız olur. – tbruyelle

+0

cc @PeterNiederwieser, cevabım tarafından bana bilgi verilmemesi durumunda ... – tbruyelle

cevap

1

Bilmiyorum, ama açıkça doFirst içinde Java sınıf için sizin derleme yapılandırmasını ekleyerek bu geçici bir çözüm bulabilirler:

variant.javaCompile.doFirst { 
    variant.javaCompile.classpath += project.configurations.myconfiguration 
} 
13

Güncelleme: Ben orijinal beri bu anlamaya başardı Cevap. Bunu yapmak yolu bağımlılıkları ekleyebilir ve daha sonra çözüm adımları bunları eklemeyi deneyin değildir böylece dinleyici kaldırmak olduğu bir DependencyResolutionListener eklemektir. .

Bu geç ama son gradle ile bırakarak herkes (2.6 için de geçerli:

compileDeps = project.getConfigurations().getByName("compile").getDependencies() 
project.getGradle().addListener(new DependencyResolutionListener() { 
    @Override 
    void beforeResolve(ResolvableDependencies resolvableDependencies) { 
     compileDeps.add(project.getDependencies().create("org.foo:bar:$version")) 
     project.getGradle().removeListener(this) 
    } 

    @Override 
    void afterResolve(ResolvableDependencies resolvableDependencies) {} 
}) 

Bu here

Orijinal Cevap kullanan bir eklenti bir çalışma örneği var Yazma süresi), bağımlılıklar çözülmeden önce DependencyResolutionListener ekleyebilir ve herhangi bir bağımlılık ekleyebilirsiniz.

project.getGradle().addListener(new DependencyResolutionListener() { 
    @Override 
    void beforeResolve(ResolvableDependencies resolvableDependencies) { 
     depsToAdd.each { dep -> 
      compileConfig.getDependencies() 
       .add(project.getDependencies().create(dep)) 
     } 
    } 

    @Override 
    void afterResolve(ResolvableDependencies resolvableDependencies) { 

    } 
}) 

Ancak bu yazı olarak ben Android Studio IDE ile çalışmak için bu bazı sorunlar başlamıştı. Sorun here

3

sorumu altında izlenir. Bu çözümü orijinal olarak Saad'in DependencyResolutionListener yaklaşımını kullanarak uygulamıştım. Ancak dinleyicinin kendisi only when something iterates over the configuration associated with the dependency olarak adlandırılır. Örneğin dinamik compile bir bağımlılık eklemek istiyorsanız, size bir şey daha sonra böyle bir şey yapar emin olmak zorunda:

project.configurations.compile.each { 
    ... 
} 

Ama compile bir olduğundan bu, tabii olarak bir şey olur ise java eklentisini kullanan herhangi bir proje için bilinen yapılandırma. Eğer (Ben gibi) özel bir yapılandırma kullanıyorsanız açıkça özel yapılandırması üzerinde yineleme sürece ancak, daha sonra dinleyici yaklaşım çalışmaz.

Bunu yapmak için daha iyi bir yol buldum ve afterEvaluate içinde OP'nin istediği gibi.Hala onlar için bağımlılıkları tekrarlatacak sahip bir noktada şeye Tabii ki

project.afterEvaluate { 
    def version = project.myPlugin.version 
    project.configurations.myConfig.dependencies.add(
     project.dependencies.add("myConfig", "org.foo:bar:$version") 
    ) 
} 

: Burada özel bir yapılandırma kullanıyorum ama compile biri için işe yaramaz neden bir neden görmüyorum aslında çözülmek için.

0

kolay yolu bunu yapmak için:

project.dependencies { 
    delegate.compile("com.android.support:appcompat-v7:25.0.1") 
} 
İlgili konular