informant tech lunch - desenvolvendo plugins grails

Post on 13-Dec-2014

459 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

top related