Informant Tech Lunch - Desenvolvendo Plugins Grails

29
PLUGINS GRAILS DESENVOLVENDO Tech Lunch Alan Fachini @alfakini

description

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

Transcript of Informant Tech Lunch - Desenvolvendo Plugins Grails

Page 1: Informant Tech Lunch - Desenvolvendo Plugins Grails

PLUGINS GRAILS DESENVOLVENDO

Tech Lunch

Alan  Fachini  -­‐  @alfakini  

Page 2: Informant Tech Lunch - Desenvolvendo Plugins Grails

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.

Page 3: Informant Tech Lunch - Desenvolvendo Plugins 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.

Page 4: Informant Tech Lunch - Desenvolvendo Plugins Grails

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.

Page 5: Informant Tech Lunch - Desenvolvendo Plugins Grails

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/**.

Page 6: Informant Tech Lunch - Desenvolvendo Plugins Grails

DISTRIBUINDO

$ grails install-plugin plugin.zip

Page 7: Informant Tech Lunch - Desenvolvendo Plugins Grails

DISTRIBUINDO

$ grails install-plugin plugin.zip

Page 8: Informant Tech Lunch - Desenvolvendo Plugins Grails

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"

Page 9: Informant Tech Lunch - Desenvolvendo Plugins Grails

GRAILS CENTRAL

Repositório oficial, necessário instalar o plugin grails-release e requisitar permissão para publicar.

$ grails publish-plugin

Page 10: Informant Tech Lunch - Desenvolvendo Plugins Grails

REPOSITÓRIO MAVEN

Necessário instalar o plugin maven-publisher.

$ grails maven-install$ grails maven-deployInteressante para distribuirmos plugins internamente.

Page 11: Informant Tech Lunch - Desenvolvendo Plugins Grails

ESTRUTURA GRAILS PLUGIN

Metadados: version, grailsVersion, dependsOn, pluginExcludes, title, author, documentation, scm, etc.

Closures: doWithWebDescriptor, doWithSpring, doWithApplicationContext, doWithDynamicMethods onChange, onConfigChange.

Page 12: Informant Tech Lunch - Desenvolvendo Plugins Grails

ESTRUTURA GRAILS PLUGIN

Page 13: Informant Tech Lunch - Desenvolvendo Plugins Grails

SPRING BEANS CONFIG

class SentryGrailsPlugin {// …def doWithSpring = { sentryAppender(SentryAppender) { }

}}

No bloco doWithSpring podemos registrar nossos springBeans.

Page 14: Informant Tech Lunch - Desenvolvendo Plugins Grails

SPRING BEANS CONFIG

class SentryGrailsPlugin {// …def doWithSpring = { sentryAppender(SentryAppender) { }

}}

No bloco doWithSpring podemos registrar nossos Beans.

Nome do Bean Classe do Bean

Page 15: Informant Tech Lunch - Desenvolvendo Plugins Grails

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

Page 16: Informant Tech Lunch - Desenvolvendo Plugins Grails

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" } }}

}

Page 17: Informant Tech Lunch - Desenvolvendo Plugins Grails

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

Page 18: Informant Tech Lunch - Desenvolvendo Plugins Grails

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.

Page 19: Informant Tech Lunch - Desenvolvendo Plugins Grails

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)

Page 20: Informant Tech Lunch - Desenvolvendo Plugins Grails

RELOAD EVENTS

A aplicação Grails é constantemente atualizada no ambiente de desenvolvimento. Plugins podem definir whatchedResources para disparar eventos onChange e onConfigChange.

Page 21: Informant Tech Lunch - Desenvolvendo Plugins Grails

RELOAD EVENTS

class ExampleGrailsPlugin {def watchedResources = “file:../grails-app/

services/*Service.groovy”def onChange = { event -> println “${event.source} has been changed.”}

}

Page 22: Informant Tech Lunch - Desenvolvendo Plugins Grails

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

Page 23: Informant Tech Lunch - Desenvolvendo Plugins Grails

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

Page 24: Informant Tech Lunch - Desenvolvendo Plugins Grails

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']

}

Page 25: Informant Tech Lunch - Desenvolvendo Plugins Grails

OBSERVANDO PLUGINS

Podemos observar outros plugins. Quando uma alteração acontecer lá, receberemos um evento aqui.

Class ExampleGrailsPlugin {def observe = ["controllers"]

}

Page 26: Informant Tech Lunch - Desenvolvendo Plugins Grails

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’]}

Page 27: Informant Tech Lunch - Desenvolvendo Plugins Grails

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")

Page 28: Informant Tech Lunch - Desenvolvendo Plugins Grails

O que vamos fazer agora?

Page 29: Informant Tech Lunch - Desenvolvendo Plugins Grails

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