<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Grails: lutando contra o cache do navegador (CSS e Ajax)</title>
	<atom:link href="http://www.itexto.net/devkico/?feed=rss2&#038;p=763" rel="self" type="application/rss+xml" />
	<link>http://www.itexto.net/devkico/?p=763</link>
	<description>Experiências em desenvolvimento de software</description>
	<lastBuildDate>Thu, 17 May 2012 23:29:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Daniel Costa (Yarkhs)</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-3307</link>
		<dc:creator>Daniel Costa (Yarkhs)</dc:creator>
		<pubDate>Fri, 11 Feb 2011 18:00:14 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-3307</guid>
		<description>Obrigado pela solução Chará. Uma linha de código e o problema de rodar o script em produção foi resolvido xD.

Eu vi uma solução aqui na minha empresa fascinante. Resolvo todos os problemas citados aqui. Ao invés de incrementar 0.1 na versão, faz versão com data e hora da compilação. 

Fica assim:
yyyyMMdd THHmm

Exemplo
de   11/02/2011 16:00
para 20110211 T1600</description>
		<content:encoded><![CDATA[<p>Obrigado pela solução Chará. Uma linha de código e o problema de rodar o script em produção foi resolvido xD.</p>
<p>Eu vi uma solução aqui na minha empresa fascinante. Resolvo todos os problemas citados aqui. Ao invés de incrementar 0.1 na versão, faz versão com data e hora da compilação. </p>
<p>Fica assim:<br />
yyyyMMdd THHmm</p>
<p>Exemplo<br />
de   11/02/2011 16:00<br />
para 20110211 T1600</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: admin</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-3005</link>
		<dc:creator>admin</dc:creator>
		<pubDate>Sun, 31 Oct 2010 23:26:24 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-3005</guid>
		<description>Oi Daniel, pelo blog fica complicado te responder. Tem como você se registrar no Grails Brasil para que eu te atenda por lá?

O endereço é http://www.grailsbrasil.com.br

É que por lá, fica muito mais fácil pra mim postar as respostas e, além disto, mais pessoas que tenham o mesmo problema que você podem ser ajudadas também ok? Te aguardo lá.

Grande abraço!</description>
		<content:encoded><![CDATA[<p>Oi Daniel, pelo blog fica complicado te responder. Tem como você se registrar no Grails Brasil para que eu te atenda por lá?</p>
<p>O endereço é <a href="http://www.grailsbrasil.com.br" rel="nofollow">http://www.grailsbrasil.com.br</a></p>
<p>É que por lá, fica muito mais fácil pra mim postar as respostas e, além disto, mais pessoas que tenham o mesmo problema que você podem ser ajudadas também ok? Te aguardo lá.</p>
<p>Grande abraço!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel Ribeiro</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-3001</link>
		<dc:creator>Daniel Ribeiro</dc:creator>
		<pubDate>Sun, 31 Oct 2010 06:06:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-3001</guid>
		<description>Oi,
Estou usando a versão 1.3.5 do GRAILS, e o evento eventWarStart não funcionou.
Verifiquei no _GRAILS_WAR.groovy que existem os eventos eventCreateWarStart e eventCreateWarEnd. Ambos os eventos funcionam, e alteram a versão APÓS gerar o WAR. O WAR é gerado com a versão antiga ainda.

Para captar o evento somente em produção pode-se utilizar o 
**  if (grails.util.Environment.current == grails.util.Environment.PRODUCTION) **

Para solucionar o problema de ponto flutuante 0.799999999 usei o seguinte algoritmo
versao = versao.split(&quot;\\.&quot;)
versao[1] = versao[1].toInteger() + 1
versao = versao.join(&quot;.&quot;)

Obs. Não consegui fazer esse script GLOBAL para todas as aplicações. Somente funcionou na pasta scripts da aplicação e não na scripts de $GRAILS_HOME

Segue o arquivo _Events.groovy final 

eventCreateWarEnd = { warName, stagingDir -&gt;
	
	if (grails.util.Environment.current == grails.util.Environment.PRODUCTION) {
        println &quot;Incrementando o número da versão&quot;
		def versao = metadata.&#039;app.version&#039;
		
		if (!versao)
			versao = 0
		else {
			versao = versao.split(&quot;\\.&quot;)
			versao[1] = versao[1].toInteger() + 1
			versao = versao.join(&quot;.&quot;)
		}
		
		metadata.&#039;app.version&#039; = versao.toString()
		
		try {
			metadata.persist()
			println &quot;Versão alterada para ${versao}&quot;
		} catch (Exception ex) {
			ex.printStackTrace()
		}
		
		println &quot;Nova versão: ${versao}&quot;
    }
}</description>
		<content:encoded><![CDATA[<p>Oi,<br />
Estou usando a versão 1.3.5 do GRAILS, e o evento eventWarStart não funcionou.<br />
Verifiquei no _GRAILS_WAR.groovy que existem os eventos eventCreateWarStart e eventCreateWarEnd. Ambos os eventos funcionam, e alteram a versão APÓS gerar o WAR. O WAR é gerado com a versão antiga ainda.</p>
<p>Para captar o evento somente em produção pode-se utilizar o<br />
**  if (grails.util.Environment.current == grails.util.Environment.PRODUCTION) **</p>
<p>Para solucionar o problema de ponto flutuante 0.799999999 usei o seguinte algoritmo<br />
versao = versao.split(&#8220;\\.&#8221;)<br />
versao[1] = versao[1].toInteger() + 1<br />
versao = versao.join(&#8220;.&#8221;)</p>
<p>Obs. Não consegui fazer esse script GLOBAL para todas as aplicações. Somente funcionou na pasta scripts da aplicação e não na scripts de $GRAILS_HOME</p>
<p>Segue o arquivo _Events.groovy final </p>
<p>eventCreateWarEnd = { warName, stagingDir -&gt;</p>
<p>	if (grails.util.Environment.current == grails.util.Environment.PRODUCTION) {<br />
        println &#8220;Incrementando o número da versão&#8221;<br />
		def versao = metadata.&#8217;app.version&#8217;</p>
<p>		if (!versao)<br />
			versao = 0<br />
		else {<br />
			versao = versao.split(&#8220;\\.&#8221;)<br />
			versao[1] = versao[1].toInteger() + 1<br />
			versao = versao.join(&#8220;.&#8221;)<br />
		}</p>
<p>		metadata.&#8217;app.version&#8217; = versao.toString()</p>
<p>		try {<br />
			metadata.persist()<br />
			println &#8220;Versão alterada para ${versao}&#8221;<br />
		} catch (Exception ex) {<br />
			ex.printStackTrace()<br />
		}</p>
<p>		println &#8220;Nova versão: ${versao}&#8221;<br />
    }<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel Costa - Yarkhs</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2977</link>
		<dc:creator>Daniel Costa - Yarkhs</dc:creator>
		<pubDate>Thu, 21 Oct 2010 18:58:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2977</guid>
		<description>De nada. Bem, tudo vai depender da necessidade do desenvolvedor. Sua necessidade era apenas a de driblar o browser. Já no caso de precisar da versão para lançar para a produção a solução que propus é melhor. 

Agora precisamos descobrir como fazer para a versão ser incrementada somente se for acionado o ambiente produção :P. Pq pode ser que a pessoa gere um war para testar e não para lançar em produção. Neste caso minha solução também é furada.</description>
		<content:encoded><![CDATA[<p>De nada. Bem, tudo vai depender da necessidade do desenvolvedor. Sua necessidade era apenas a de driblar o browser. Já no caso de precisar da versão para lançar para a produção a solução que propus é melhor. </p>
<p>Agora precisamos descobrir como fazer para a versão ser incrementada somente se for acionado o ambiente produção :P. Pq pode ser que a pessoa gere um war para testar e não para lançar em produção. Neste caso minha solução também é furada.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: admin</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2976</link>
		<dc:creator>admin</dc:creator>
		<pubDate>Thu, 21 Oct 2010 18:52:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2976</guid>
		<description>Valeu Daniel! Muito bem observado. 

Realmente, a solução que propus incrementa a versão o tempo inteiro. Como nesta situação o objetivo era apenas evitar o problema do cache, e o número da versão não tinha muita função para mim além disto, eu fiz vista grossa ao problema.

Vou modificar meu aplicativo pra que fique tal como você falou.

Novamente, valeu!</description>
		<content:encoded><![CDATA[<p>Valeu Daniel! Muito bem observado. </p>
<p>Realmente, a solução que propus incrementa a versão o tempo inteiro. Como nesta situação o objetivo era apenas evitar o problema do cache, e o número da versão não tinha muita função para mim além disto, eu fiz vista grossa ao problema.</p>
<p>Vou modificar meu aplicativo pra que fique tal como você falou.</p>
<p>Novamente, valeu!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel Costa - Yarkhs</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2975</link>
		<dc:creator>Daniel Costa - Yarkhs</dc:creator>
		<pubDate>Thu, 21 Oct 2010 18:25:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2975</guid>
		<description>Esta solução que você apresentou resolve o problema de cache do browser mas não o da versão, caso a pessoa queira que a versão seja incrementada automaticamente. Pois o evento compilar pega todo script que compile, ou seja, quando você der grails run-app para testar a aplicação ele vai incrementar a versão.

Eu descobri uma forma pra resolver este problema. Basta ao invés de por o nome do evento &quot;eventCompileStart&quot;, usar o nome &quot;eventWarStart&quot;. Assim toda vez que você quiser testar a aplicação antes de levar a produção pode fazê-lo sem alterar a versão. E quando for gerar um arquivo war para levar a um servidor java ele irá incrementar a versão. 

Esta ainda não é a melhor das soluções pois não se restringe ao ambiente de produção. Ele atinge a todos os ambientes. Mas pra quem lida com versão, não busca somente driblar o cache do browser e não quer ficar fazendo manutenção na mão, esta solução já facilita as coisas.</description>
		<content:encoded><![CDATA[<p>Esta solução que você apresentou resolve o problema de cache do browser mas não o da versão, caso a pessoa queira que a versão seja incrementada automaticamente. Pois o evento compilar pega todo script que compile, ou seja, quando você der grails run-app para testar a aplicação ele vai incrementar a versão.</p>
<p>Eu descobri uma forma pra resolver este problema. Basta ao invés de por o nome do evento &#8220;eventCompileStart&#8221;, usar o nome &#8220;eventWarStart&#8221;. Assim toda vez que você quiser testar a aplicação antes de levar a produção pode fazê-lo sem alterar a versão. E quando for gerar um arquivo war para levar a um servidor java ele irá incrementar a versão. </p>
<p>Esta ainda não é a melhor das soluções pois não se restringe ao ambiente de produção. Ele atinge a todos os ambientes. Mas pra quem lida com versão, não busca somente driblar o cache do browser e não quer ficar fazendo manutenção na mão, esta solução já facilita as coisas.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: admin</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2873</link>
		<dc:creator>admin</dc:creator>
		<pubDate>Wed, 15 Sep 2010 15:50:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2873</guid>
		<description>Vivendo e aprendendo. Valeu pela dica!</description>
		<content:encoded><![CDATA[<p>Vivendo e aprendendo. Valeu pela dica!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Caique Dourado</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2872</link>
		<dc:creator>Caique Dourado</dc:creator>
		<pubDate>Wed, 15 Sep 2010 14:18:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2872</guid>
		<description>Você pode também configurar o JQuery para evitar o cache em todas as requisições AJAX

$.ajaxSetup({ cache: false });</description>
		<content:encoded><![CDATA[<p>Você pode também configurar o JQuery para evitar o cache em todas as requisições AJAX</p>
<p>$.ajaxSetup({ cache: false });</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: admin</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2798</link>
		<dc:creator>admin</dc:creator>
		<pubDate>Sat, 28 Aug 2010 17:56:06 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2798</guid>
		<description>Oi Lucas, quanto tempo!

Valeu pela dica!</description>
		<content:encoded><![CDATA[<p>Oi Lucas, quanto tempo!</p>
<p>Valeu pela dica!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Lucas Teixeira</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2797</link>
		<dc:creator>Lucas Teixeira</dc:creator>
		<pubDate>Sat, 28 Aug 2010 17:44:17 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2797</guid>
		<description>Ahh, esqueci de dizer, ele inclusive trabalha com imagens para fazer css-sprites!

Pra isso usa o SmartSprites (csssprites.org)!!

[]s!</description>
		<content:encoded><![CDATA[<p>Ahh, esqueci de dizer, ele inclusive trabalha com imagens para fazer css-sprites!</p>
<p>Pra isso usa o SmartSprites (csssprites.org)!!</p>
<p>[]s!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Lucas Teixeira</title>
		<link>http://www.itexto.net/devkico/?p=763&#038;cpage=1#comment-2796</link>
		<dc:creator>Lucas Teixeira</dc:creator>
		<pubDate>Sat, 28 Aug 2010 17:43:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.itexto.net/devkico/?p=763#comment-2796</guid>
		<description>Prática a saída, &quot;engana&quot; o browser e evita o cache :)

Vale dar uma boa olhada no plugin ui-performance, que faz isto de maneira automatizada! Ele tb concatena e minifica arquivos css e js automagicamente!

Ele trata essa questão da versão também, não só para css, mas pra js e imagens, inclusive, quando o pacote é gerado, ele altera as referencias das imagens que estavam até dentro de arquivos CSS (tipo um background: url(...) )

Além disso, na hora de servir os arquivos, ele adiciona headers no response para cachear ao &quot;infinito&quot; aquela url, ou seja, como ele cacheia forever, e a url é sempre diferente, ele consegue dar a segurança que virá sempre pegar os novos, mas nunca duas vezes o mesmo arquivo! 

É bem prático, estou usando em projetos em produção e quebrou um galho e tanto!

Diria que é um dos top-5 plugins mais legais e importantes!

Abração!!</description>
		<content:encoded><![CDATA[<p>Prática a saída, &#8220;engana&#8221; o browser e evita o cache :)</p>
<p>Vale dar uma boa olhada no plugin ui-performance, que faz isto de maneira automatizada! Ele tb concatena e minifica arquivos css e js automagicamente!</p>
<p>Ele trata essa questão da versão também, não só para css, mas pra js e imagens, inclusive, quando o pacote é gerado, ele altera as referencias das imagens que estavam até dentro de arquivos CSS (tipo um background: url(&#8230;) )</p>
<p>Além disso, na hora de servir os arquivos, ele adiciona headers no response para cachear ao &#8220;infinito&#8221; aquela url, ou seja, como ele cacheia forever, e a url é sempre diferente, ele consegue dar a segurança que virá sempre pegar os novos, mas nunca duas vezes o mesmo arquivo! </p>
<p>É bem prático, estou usando em projetos em produção e quebrou um galho e tanto!</p>
<p>Diria que é um dos top-5 plugins mais legais e importantes!</p>
<p>Abração!!</p>
]]></content:encoded>
	</item>
</channel>
</rss>

