Upload
alan-fachini
View
462
Download
4
Embed Size (px)
DESCRIPTION
Apresentação no Tech Lunch da Informant sobre desenvolvimento de plugins Grails e apresentação do plugin Sentry.
Citation preview
PLUGINS GRAILS DESENVOLVENDO
Tech Lunch
Alan Fachini -‐ @alfakini
MOTIVAÇÃO
Integração de um projeto interno com uma ferramenta de agregação de Exceptions para monitorar os bugs vivenciados pelos usuários em produção.
Sentry surgiu como uma boa opção, porém não existia uma implementação do plugin para Grails.
DEFINE PLUGINS
DRY. Melhor encapsulamento. Reduz complexidade. Facilidade em testar. Responsabilidades bem definidas.
Plugins Grails são similares a aplicações Grails.
Internamente o framework é implementado utilizando plugins.
CRIANDO UM PLUGIN
$ grails create-plugin sentryCria a estrutura base do plugin, similar a de uma aplicação. A diferença básica é a presença do descritor do plugin SentryGrailsPlugin.groovy.
EMPACOTANDO
$ grails package-pluginCria um pacote grails-sentry-0.1.zip contendo a estrutura do plugin e o arquivo plugin.xml com dados 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/**.
DISTRIBUINDO
$ grails install-plugin plugin.zip
DISTRIBUINDO
$ grails install-plugin plugin.zip
DISTRIBUINDO
Em BuildConfig.groovy adicione:
grails.plugin.location.sentry = "/path/to/plugin"
Interessante para teste local e para distribuir uma aplicação dividida em vários plugins:
grails.plugin.location.sentry = ”../plugin"
GRAILS CENTRAL
Repositório oficial, necessário instalar o plugin grails-release e requisitar permissão para publicar.
$ grails publish-plugin
REPOSITÓRIO MAVEN
Necessário instalar o plugin maven-publisher.
$ grails maven-install$ grails maven-deployInteressante para distribuirmos plugins internamente.
ESTRUTURA GRAILS PLUGIN
Metadados: version, grailsVersion, dependsOn, pluginExcludes, title, author, documentation, scm, etc.
Closures: doWithWebDescriptor, doWithSpring, doWithApplicationContext, doWithDynamicMethods onChange, onConfigChange.
ESTRUTURA GRAILS PLUGIN
SPRING BEANS CONFIG
class SentryGrailsPlugin {// …def doWithSpring = { sentryAppender(SentryAppender) { }
}}
No bloco doWithSpring podemos registrar nossos springBeans.
SPRING BEANS CONFIG
class SentryGrailsPlugin {// …def doWithSpring = { sentryAppender(SentryAppender) { }
}}
No bloco doWithSpring podemos registrar nossos Beans.
Nome do Bean Classe do Bean
CONFIGURAÇÕES
Podemos configurar a aplicação em tempo de execuçã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
ADD MÉTODOS DINÂMICOS É possível adicionar em tempo de execução métodos dinâmicos em qualquer classe gerenciada pelo projeto Grails. Controller, Taglib, Domain, etc.
class ExampleGrailsPlugin {def doWithDynamicMethods = { appCtx -> for (cClass in application.controllerClasses { cClass.metaClass.myNewMethod = { -> println "hello world" } }}
}
ADD MÉTODOS DINÂMICOS É possível adicionar em tempo de execução métodos dinâmicos em qualquer classe gerenciada pelo projeto Grails. Controller, Taglib, Domain, etc.
class ExampleGrailsPlugin {def doWithDynamicMethods = { appCtx -> for (cClass in application.controllerClasses { cClass.metaClass.myNewMethod = { -> println "hello world" } }}
}
GrailsApplication
GRAILSAPPLICATION
Está disponível no plugin através do objeto application.
Provê metodos para trabalhar com as convenções do projeto e guarda referências de todas as classes de artefatos da aplicação.
GRAILSAPPLICATION
Mé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)
RELOAD EVENTS
A aplicação Grails é constantemente atualizada no ambiente de desenvolvimento. Plugins podem definir whatchedResources para disparar eventos onChange e onConfigChange.
RELOAD EVENTS
class ExampleGrailsPlugin {def watchedResources = “file:../grails-app/
services/*Service.groovy”def onChange = { event -> println “${event.source} has been changed.”}
}
RELOAD EVENTS
class ExampleGrailsPlugin {def watchedResources = “file:../grails-app/
services/*Service.groovy”def onChange = { event -> println “${event.source} has been changed.”}
}Define o conjuntode arquivos monitorados
Quando um arquivo é modificado, onChangeé chamado
OBJETO EVENT
Define 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
INFLUENCIANDO PLUGINS
Além de reagir a eventos, as vezes um plugin precisa influenciar outro. Isso significa que além de atualizar a si mesmo, ele pode encadear o evento para os demais plugins que dependem da funcionalidade que ele implementa.
Class ExampleGrailsPlugin {def influences = ['controllers']
}
OBSERVANDO PLUGINS
Podemos observar outros plugins. Quando uma alteração acontecer lá, receberemos um evento aqui.
Class ExampleGrailsPlugin {def observe = ["controllers"]
}
OUTRAS PROPRIEDADES
loadAfter, loadBefore, environments, scopes
Class ExampleGrailsPlugin {def loadAfter = [‘controllers’]def loadBefore = [‘otherPlugin’]def environments = [‘development’, ‘test’]def scopes = [includes: [‘test’, ‘run’],
excludes:’war’]}
SCRIPTS
Podemos escrever scripts Gant para realizar tarefas na instalação e remoção do plugin ou para algum outro 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")
O que vamos fazer agora?
REFERÊNCIAS Grails: Plugins - Reference Documentation
grails.org/doc/latest/guide/plugins.html
Grails: Publishing Plugins grails.org/Creating+Plugins
Release Plugin - Reference Documentation grails-plugins.github.com/grails-release
Grails: How To Plug In – Burt Beckwith (SpringSource) www.slideshare.net/gr8conf/grails-pluggingin-burtbeckwith2011