<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Merb 0.9 continious gem rebuilding</title>
    <link>http://blog.zabiello.com/articles/2008/02/20/merb-0-9-continious-gem-rebuilding</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Merb 0.9 continious gem rebuilding</title>
      <description>&lt;p&gt;Niedawno opublikowane na RubyForge gemy Merb o wersji 0.9 wcale nie oznaczaj&#261; &#380;e jest to wersje produkcyjna. Podobnie jak w wypadku Rubiego 1.9, tw&#243;rcy Merba 0.9 okre&#347;laj&#261; t&#261; wersj&#281; jako &lt;em&gt;developersk&#261;&lt;/em&gt;. Jej celem jest wyczyszczenie b&#322;&#281;d&#243;w przed maj&#261;ca nadej&#347;&#263; wersj&#261; 1.0. Moim zdaniem nie ma sensu korzysta&#263; z gem&#243;w 0.9, lepiej od razu wskoczy&#263; na wersj&#281;&#160;edge.&lt;/p&gt;


	&lt;h2&gt;Frozen Merb&lt;/h2&gt;


	&lt;p&gt;Kod Merb&amp;#8217;a 0.9 zosta&#322; troch&#281; podzielony na kilka mniejszych gem&#243;w. Celem takiego podej&#347;cia jest wi&#281;ksza elastyczno&#347;&#263;. Mniejsza o to. Nowy gem &lt;code&gt;gem-gen&lt;/code&gt; udost&#281;pnia skrypt zamra&#380;aj&#261;cy framdework. Nale&#380;y w katalogu z projektem stworzy&#263; katalog &lt;code&gt;framework&lt;/code&gt; i tam zainstalowa&#263; najnowszy kod rozwojowy. Trzeba mie&#263; oczywi&#347;cie zainstalowany system wersjonowania kodu &amp;#8211; Git (&lt;code&gt;port install git-core&lt;/code&gt; dla &lt;span class="caps"&gt;OSX&lt;/span&gt;, lub &lt;code&gt;sudo apt-get install git-core&lt;/code&gt; dla Linuksa).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_bash "&gt;mkdir framework
cd framework
git clone git://github.com/wycats/merb-core.git
git clone git://github.com/wycats/merb-more.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Wszystkie generatory s&#261; w Merbie realizowane przez skrypt &lt;code&gt;merb-gen&lt;/code&gt; (oparty na gemie o tej samej nazwie). Jedn&#261; z opcji merb-gen&amp;#8217;a jest mo&#380;liwo&#347;&#263; stworzenia specjalnego skryptu kt&#243;ry b&#281;dzie odpala&#322;&#160;gemy Merba z naszego katalogu &lt;code&gt;framework&lt;/code&gt; zamiast z systemu. Skrypt mo&#380;na stworzy&#263; za pomoc&#261; komendy.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_bash "&gt;merb-gen freezer frozen_merb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Od tej chwili mo&#380;na odpala&#263; projekt za pomoc&#261; komendy &lt;code&gt;script/frozen-merb&lt;/code&gt;. Dla wygody, podaj&#281; kod tasku rake&amp;#8217;a aktualizuj&#261;cego biblioteki w katalogu &lt;code&gt;framework&lt;/code&gt;. Kod jest prosty, przechodzi do podkatalogu i odpala komend&#281; &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Update all gits from frozen framework&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;namespace&lt;/span&gt; &lt;span class="symbol"&gt;:framework&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:update&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;    
    &lt;span class="ident"&gt;framework_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Merb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;framework&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;directory?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;framework_path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;core&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;more&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;plugins&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;framework_path&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;merb-&lt;span class="expr"&gt;#{x}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
        &lt;span class="ident"&gt;sh&lt;/span&gt; &lt;span class="punct"&gt;%{&lt;/span&gt;&lt;span class="string"&gt;cd &lt;span class="expr"&gt;#{path}&lt;/span&gt;; git pull&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Niestety, nie jest to rozwi&#261;zanie idealne, bo sam skrypt &lt;code&gt;frozen-merb&lt;/code&gt; zak&#322;ada &#380;e mamy w systemie zainstalowany gem &lt;code&gt;merb-core&lt;/code&gt;. Podobnie nie dzia&#322;aj&#261; zadania Rake&amp;#8217;a je&#347;liw  systemie nie ma &#380;adnych gem&#243;w Merba. Troch&#281; to niekonsekwentne, bo cz&#281;&#347;&#263; kodu korzysta z edge a cz&#281;&#347;&#263; ze starszych gem&#243;w w systemie. Problem ten rozwi&#261;zuje zupe&#322;nie inny pomys&#322;.&lt;/p&gt;


	&lt;h2&gt;Continious gem rebuilding&lt;/h2&gt;


	&lt;p&gt;W tym wypadku po prostu ka&#380;da aktualizja kodu rozwojowego automatycznie przebudowuje gemy w systemie. Poni&#380;szy kod zadzia&#322;a nawet jak w systemie nie mamy zainstalowanego ani jednego gemu Merba (z tego te&#380; powodu nie umieszczam go jako zadanie Rake&amp;#8217;a) Skrypt nale&#380;y skopiowa&#263; do podkatalogu &lt;code&gt;framework&lt;/code&gt; (cho&#263; mo&#380;na go lekko zmodyfikowa&#263; aby dzia&#322;a&#322; z dowolnego katalogu). Ca&#322;y kod sprowadza si&#281; do odpalenia od czasu poni&#380;szego skryptu.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;span class="punct"&gt;%w(&lt;/span&gt;&lt;span class="string"&gt;merb-core merb-more merb-plugins&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;entry&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Updating git for &lt;span class="expr"&gt;#{entry}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;cd &lt;span class="expr"&gt;#{entry}&lt;/span&gt;; git pull&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="punct"&gt;%w(&lt;/span&gt;&lt;span class="string"&gt;merb-plugins/merb_* merb-more/merb-* merb-more merb-core&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;entry&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;glob&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;entry&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;dir&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; 
    &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;cd &lt;span class="expr"&gt;#{dir}&lt;/span&gt;; rake repackage&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;system&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;sudo gem uninstall -a -i -x &lt;span class="expr"&gt;#{File.basename(dir)}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;Gem&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;InstallError&lt;/span&gt; 
    &lt;span class="ident"&gt;system&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;sudo gem install --no-rdoc --no-ri -f -l &lt;span class="expr"&gt;#{dir}&lt;/span&gt;/pkg/*&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W tej metodzie &lt;strong&gt;nie&lt;/strong&gt; musimy odpala&#263; &lt;code&gt;script/frozen-merb&lt;/code&gt;, wystarczy zwyk&#322;a komenda &lt;code&gt;merb&lt;/code&gt;. Powy&#380;szy skrypt doda&#322;em do repozytorium Merba jako &lt;a href="http://merb.lighthouseapp.com/projects/7433-merb-core/tickets/143-enhancement-continious-edge-gem-rebuilder"&gt;proponowane ulepszenie&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Najnowsza dokumentacja RDoc do merb-core umieszczona jest na &lt;a href="http://blog.zabiello.com/merb-core/"&gt;http://blog.zabiello.com/merb-core/&lt;/a&gt; (jest od&#347;wie&#380;ana co godzin&#281;).&lt;/p&gt;</description>
      <pubDate>Wed, 20 Feb 2008 16:10:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:5446736c-6529-4faa-98dc-cd81958d8a0d</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/02/20/merb-0-9-continious-gem-rebuilding</link>
      <category>merb</category>
    </item>
  </channel>
</rss>
