Próbuję napisać wtyczkę, która dodaje zależności do project.dependencies
zgodnie z informacjami zebranymi w obiekcie rozszerzenia wtyczki. Ale wydaje się to niemożliwe.Wtyczka niestandardowa Gradle: dodaj zależność od obiektu rozszerzenia
Rzeczywiście dane z obiektu rozszerzenia są dostępne tylko w nowym zadaniu lub w zamknięciu project.afterEvaluate
, ale zależności dodane w tych miejscach są ignorowane.
Poniższy kod próbuje dodać zależność w afterEvaluate
ale zależność jest ignorowane:
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
}
W poniższym kodzie prace wstrzykiwania zależności, ale nie mam dostępu do obiekt rozszerzenia:
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
}
Czy istnieje rozwiązanie?
Będziesz musiał odroczyć dostęp do rozszerzenia, w taki czy inny sposób. Nie jest dla mnie jasne, dlaczego dodanie zależności w 'project.afterEvaluate' nie zadziałałoby. Może to być problem z kodem korzystającym z wtyczki. –
Dzięki, uprościłem kod, aby zachować jasność, możesz znaleźć cały kod [tutaj] (https://github.com/tbruyelle/ResetUnreadSms/blob/aa-plugin/build.gradle). Jest to wtyczka do Androida dla biblioteki, która generuje klasy java z adnotacji. Wtyczka działa dobrze bez obiektów rozszerzeń, ale kończy się niepowodzeniem, jeśli chcę wstrzyknąć zależności z danymi z obiektów rozszerzeń, jak wyjaśniono w pytaniu. – tbruyelle
cc @PeterNiederwieser w przypadku, gdy moja odpowiedź nie została powiadomiona ... – tbruyelle