Your SlideShare is downloading. ×
Informant Tech Lunch - Desenvolvendo Plugins Grails
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Informant Tech Lunch - Desenvolvendo Plugins Grails

484
views

Published on

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

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
484
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
10
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Tech LunchDESENVOLVENDO PLUGINS GRAILS Alan  Fachini  -­‐  @alfakini  
  • 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. 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. 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. 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. DISTRIBUINDO$ grails install-plugin plugin.zip
  • 7. DISTRIBUINDO$ grails install-plugin plugin.zip
  • 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. GRAILS CENTRALRepositório oficial, necessário instalar o plugingrails-release e requisitar permissão para publicar.$ grails publish-plugin
  • 10. REPOSITÓRIO MAVENNecessário instalar o plugin maven-publisher.$ grails maven-install $ grails maven-deploy Interessante para distribuirmos pluginsinternamente.
  • 11. ESTRUTURA GRAILS PLUGINMetadados: version, grailsVersion, dependsOn,pluginExcludes, title, author, documentation, scm,etc.Closures: doWithWebDescriptor, doWithSpring,doWithApplicationContext, doWithDynamicMethodsonChange, onConfigChange.
  • 12. ESTRUTURA GRAILS PLUGIN
  • 13. SPRING BEANS CONFIGNo bloco doWithSpring podemos registrar nossosspringBeans.class SentryGrailsPlugin { // … def doWithSpring = { sentryAppender(SentryAppender) { } } }
  • 14. SPRING BEANS CONFIGNo bloco doWithSpring podemos registrar nossosBeans.class SentryGrailsPlugin { // … def doWithSpring = { sentryAppender(SentryAppender) { } } } Nome do Bean Classe do Bean
  • 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. 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. 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. 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. 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. RELOAD EVENTSA aplicação Grails é constantemente atualizada noambiente de desenvolvimento. Plugins podemdefinir whatchedResources para disparar eventosonChange e onConfigChange.
  • 21. RELOAD EVENTSclass ExampleGrailsPlugin { def watchedResources = “file:../grails-app/services/*Service.groovy” def onChange = { event -> println “${event.source} has been changed.” } }
  • 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. 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. 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. OBSERVANDO PLUGINSPodemos observar outros plugins. Quando umaalteração acontecer lá, receberemos um eventoaqui.Class ExampleGrailsPlugin { def observe = ["controllers"] }
  • 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. 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. O que vamos fazer agora?
  • 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

×