Informant Tech Lunch - Desenvolvendo Plugins Grails

807 views

Published on

Apresentação no Tech Lunch da Informant sobre desenvolvimento de plugins Grails e apresentação do plugin Sentry.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
807
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Informant Tech Lunch - Desenvolvendo Plugins Grails

  1. 1. Tech LunchDESENVOLVENDO PLUGINS GRAILS Alan  Fachini  -­‐  @alfakini  
  2. 2. MOTIVAÇÃOIntegração de um projeto interno com umaferramenta de agregação de Exceptions paramonitorar os bugs vivenciados pelos usuários emprodução.Sentry surgiu como uma boa opção, porém nãoexistia uma implementação do plugin para Grails.
  3. 3. DEFINE PLUGINSDRY. Melhor encapsulamento. Reduz complexidade.Facilidade em testar. Responsabilidades bemdefinidas.Plugins Grails são similares a aplicações Grails.Internamente o framework é implementadoutilizando plugins.
  4. 4. CRIANDO UM PLUGIN$ grails create-plugin sentry Cria a estrutura base do plugin, similar a de uma aplicação. A diferença básica é a presença dodescritor do plugin SentryGrailsPlugin.groovy.
  5. 5. EMPACOTANDO$ grails package-plugin Cria um pacote grails-sentry-0.1.zip contendo a estrutura do plugin e o arquivo plugin.xml comdados do plugin.Alguns recursos não são empacotados:Bootstrap.groovy, Config.groovy, DataSource.groovy,UrlMappings.groovy, spring/resources.groovy, /web-app/WEB-INF, /web-app/plugins/**, /test/**.
  6. 6. DISTRIBUINDO$ grails install-plugin plugin.zip
  7. 7. DISTRIBUINDO$ grails install-plugin plugin.zip
  8. 8. DISTRIBUINDOEm BuildConfig.groovy adicione:grails.plugin.location.sentry = "/path/to/plugin" Interessante para teste local e para distribuir umaaplicação dividida em vários plugins:grails.plugin.location.sentry = ”../plugin"
  9. 9. GRAILS CENTRALRepositório oficial, necessário instalar o plugingrails-release e requisitar permissão para publicar.$ grails publish-plugin
  10. 10. REPOSITÓRIO MAVENNecessário instalar o plugin maven-publisher.$ grails maven-install $ grails maven-deploy Interessante para distribuirmos pluginsinternamente.
  11. 11. ESTRUTURA GRAILS PLUGINMetadados: version, grailsVersion, dependsOn,pluginExcludes, title, author, documentation, scm,etc.Closures: doWithWebDescriptor, doWithSpring,doWithApplicationContext, doWithDynamicMethodsonChange, onConfigChange.
  12. 12. ESTRUTURA GRAILS PLUGIN
  13. 13. SPRING BEANS CONFIGNo bloco doWithSpring podemos registrar nossosspringBeans.class SentryGrailsPlugin { // … def doWithSpring = { sentryAppender(SentryAppender) { } } }
  14. 14. SPRING BEANS CONFIGNo bloco doWithSpring podemos registrar nossosBeans.class SentryGrailsPlugin { // … def doWithSpring = { sentryAppender(SentryAppender) { } } } Nome do Bean Classe do Bean
  15. 15. CONFIGURAÇÕESPodemos configurar a aplicação em tempo deexecução através do bloco doWithApplicationContext.class SentryGrailsPlugin { def doWithApplicationContext = { appCtx -> def appender = appCtx.sentryAppender appender.activateOptions() Logger.rootLogger.addAppender(appender) } Bean registrado } em doWithSpring
  16. 16. ADD MÉTODOS DINÂMICOSÉ possível adicionar em tempo de execuçãométodos dinâmicos em qualquer classe gerenciadapelo projeto Grails. Controller, Taglib, Domain, etc.class ExampleGrailsPlugin { def doWithDynamicMethods = { appCtx -> for (cClass in application.controllerClasses { cClass.metaClass.myNewMethod = { -> println "hello world" } } } }
  17. 17. ADD MÉTODOS DINÂMICOSÉ possível adicionar em tempo de execuçãométodos dinâmicos em qualquer classe gerenciadapelo projeto Grails. Controller, Taglib, Domain, etc.class ExampleGrailsPlugin { def doWithDynamicMethods = { appCtx -> for (cClass in application.controllerClasses { cClass.metaClass.myNewMethod = { -> println "hello world" } } GrailsApplication } }
  18. 18. GRAILSAPPLICATIONEstá disponível no plugin através do objetoapplication.Provê metodos para trabalhar com as convençõesdo projeto e guarda referências de todas as classesde artefatos da aplicação.
  19. 19. GRAILSAPPLICATIONMétodos úteis: get*Classes. Ex: getControllerClasses() get*Class(String clazz). Ex: getControllerClass(“LoginController”) is*Class(Class clazz). Ex: isControllerClass(LoginController) add*Class(Class clazz). Ex: addControllerClass(LoginController)
  20. 20. RELOAD EVENTSA aplicação Grails é constantemente atualizada noambiente de desenvolvimento. Plugins podemdefinir whatchedResources para disparar eventosonChange e onConfigChange.
  21. 21. RELOAD EVENTSclass ExampleGrailsPlugin { def watchedResources = “file:../grails-app/services/*Service.groovy” def onChange = { event -> println “${event.source} has been changed.” } }
  22. 22. RELOAD EVENTSclass ExampleGrailsPlugin { def watchedResources = “file:../grails-app/services/*Service.groovy” def onChange = { event -> println “${event.source} has been changed.” } Define o conjunto de arquivos } monitorados Quando um arquivo é modificado, onChange é chamado
  23. 23. OBJETO EVENTDefine alguns propriedades úteis: event.source: origem do evento event.ctx: instância ApplicationContext event.plugin: instância do Plugin event.application: instância GrailsApplication event.manager: instância GrailsPluginManager
  24. 24. INFLUENCIANDO PLUGINSAlém de reagir a eventos, as vezes um pluginprecisa influenciar outro. Isso significa que além deatualizar a si mesmo, ele pode encadear o eventopara os demais plugins que dependem dafuncionalidade que ele implementa.Class ExampleGrailsPlugin { def influences = [controllers] }
  25. 25. OBSERVANDO PLUGINSPodemos observar outros plugins. Quando umaalteração acontecer lá, receberemos um eventoaqui.Class ExampleGrailsPlugin { def observe = ["controllers"] }
  26. 26. OUTRAS PROPRIEDADESloadAfter, loadBefore, environments, scopesClass ExampleGrailsPlugin { def loadAfter = [‘controllers’] def loadBefore = [‘otherPlugin’] def environments = [‘development’, ‘test’] def scopes = [includes: [‘test’, ‘run’],excludes:’war’] }
  27. 27. SCRIPTSPodemos escrever scripts Gant para realizar tarefasna instalação e remoção do plugin ou para algumoutro evento específico: _Install.groovy, _Uninstall.groovy,_Upgrade.groovy, _Events.groovy.ant.mkdir(dir: "${basedir}/grails-app/example") ant.copy(file: "${pluginBasedir}/src/samples/ExamplePluginConfig.groovy”, todir: "${basedir}/grails-app/conf")
  28. 28. O que vamos fazer agora?
  29. 29. REFERÊNCIASGrails: Plugins - Reference Documentation grails.org/doc/latest/guide/plugins.htmlGrails: Publishing Plugins grails.org/Creating+PluginsRelease Plugin - Reference Documentation grails-plugins.github.com/grails-releaseGrails: How To Plug In – Burt Beckwith (SpringSource) www.slideshare.net/gr8conf/grails-pluggingin-burtbeckwith2011

×