Я хотел бы добавить функцию к существующим типам, в моем случае это 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
Можете ли вы попробовать это, пожалуйста
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
Других решений пока нет …