Gradle: расширение DLS существующего типа

Я хотел бы добавить функцию к существующим типам, в моем случае это NativeLibrarySpec,

Я пробовал с расширение Gradle и он все еще работает, но теперь я хочу обобщить его для возможности использовать его, как если бы это была стандартная функциональность DSL NativeLibrarySpec,
Проблема в том, что я могу получить доступ к экземпляру только после его настройки (блок, содержащий мою функцию), и поэтому он не работает, потому что он пытается вызвать specialConfig прежде чем я смогу связать это …

Вот код (не волнует тот факт, что этот пример для нативного программного обеспечения C ++):

// File: build.gradle
apply plugin: 'cpp'

class SpecialConfig {
NativeComponentSpec componentSpec

SpecialConfig(NativeComponentSpec componentSpec) {
this.componentSpec = componentSpec
}

def something(boolean enabled) {
componentSpec.sources {
cpp {
// Some important stuffs
}
}
}
}

model {
components {
main(NativeLibrarySpec) {
// How to bring this out ??
project.extensions.create('specialConfig', SpecialConfig, it)

// This is the new functionality I want to use
specialConfig {
something(true)
}
}
}
}

Вот другой пример, но он будет работать только из проекта. *
https://dzone.com/articles/gradle-goodness-extending-dsl

0

Решение

Можете ли вы попробовать это, пожалуйста

plugins {
id 'cpp'
}

class SpecialConfig {
// no need to pass this to the constructor we can just make it a
// method arg instead
SpecialConfig() {
}

// manipulate spec as desired
def something(NativeComponentSpec spec, boolean enabled) {
println "Hello something!"spec.sources {
cpp {
// Some important stuffs
}
}
}
}

// add your extension earlier
project.extensions.create('specialConfig', SpecialConfig)
model {
components {
main(NativeLibrarySpec) { mySpec ->
// we can call our extension via the project
project.specialConfig { config ->
// our closure is handed an instance of the class
// on that we can call methods
config.something(mySpec, true)
}
// or more simply we could make it a one liner
project.specialConfig.something(mySpec, true)
}
}
}

выходы:

$ gradle build
Configuration on demand is an incubating feature.
Hello something!
:linkMainSharedLibrary UP-TO-DATE
:mainSharedLibrary UP-TO-DATE
:createMainStaticLibrary UP-TO-DATE
:mainStaticLibrary UP-TO-DATE
:assemble UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL

Total time: 1.104 secs
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector