2017-01-20 2 views
0

Я хотел бы добавить функцию к существующим типам, в моем случае это NativeLibrarySpec.Gradle: расширение DLS существующего типа

Я пробовал с gradle extensions, и он уже работает, но теперь я хочу обобщить его для возможности использовать его, как если бы это была стандартная функциональность 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

Спасибо за ваше время :) К сожалению, я ищу способ сделать это без необходимости передавать параметры, код должен выглядеть свободно – 56ka

Смежные вопросы