Merb 0.9 continious gem rebuilding

Posted by Jarosław Zabiełło Wed, 20 Feb 2008 15:10:00 GMT

Niedawno opublikowane na RubyForge gemy Merb o wersji 0.9 wcale nie oznaczają że jest to wersje produkcyjna. Podobnie jak w wypadku Rubiego 1.9, twórcy Merba 0.9 określają tą wersję jako developerską. Jej celem jest wyczyszczenie błędów przed mająca nadejść wersją 1.0. Moim zdaniem nie ma sensu korzystać z gemów 0.9, lepiej od razu wskoczyć na wersję edge.

Frozen Merb

Kod Merb’a 0.9 został trochę podzielony na kilka mniejszych gemów. Celem takiego podejścia jest większa elastyczność. Mniejsza o to. Nowy gem gem-gen udostępnia skrypt zamrażający framdework. Należy w katalogu z projektem stworzyć katalog framework i tam zainstalować najnowszy kod rozwojowy. Trzeba mieć oczywiście zainstalowany system wersjonowania kodu – Git (port install git-core dla OSX, lub sudo apt-get install git-core dla Linuksa).

mkdir framework
cd framework
git clone git://github.com/wycats/merb-core.git
git clone git://github.com/wycats/merb-more.git

Wszystkie generatory są w Merbie realizowane przez skrypt merb-gen (oparty na gemie o tej samej nazwie). Jedną z opcji merb-gen’a jest możliwość stworzenia specjalnego skryptu który będzie odpalał gemy Merba z naszego katalogu framework zamiast z systemu. Skrypt można stworzyć za pomocą komendy.

merb-gen freezer frozen_merb

Od tej chwili można odpalać projekt za pomocą komendy script/frozen-merb. Dla wygody, podaję kod tasku rake’a aktualizującego biblioteki w katalogu framework. Kod jest prosty, przechodzi do podkatalogu i odpala komendę git pull.

desc 'Update all gits from frozen framework'
namespace :framework do
  task :update do    
    framework_path = File.join(Merb.root, 'framework')
    if File.directory?(framework_path)
      ['core', 'more', 'plugins'].each do |x|
        path = File.join(framework_path, "merb-#{x}")
        sh %{cd #{path}; git pull}
      end
    end
  end
end

Niestety, nie jest to rozwiązanie idealne, bo sam skrypt frozen-merb zakłada że mamy w systemie zainstalowany gem merb-core. Podobnie nie działają zadania Rake’a jeśliw systemie nie ma żadnych gemów Merba. Trochę to niekonsekwentne, bo część kodu korzysta z edge a część ze starszych gemów w systemie. Problem ten rozwiązuje zupełnie inny pomysł.

Continious gem rebuilding

W tym wypadku po prostu każda aktualizja kodu rozwojowego automatycznie przebudowuje gemy w systemie. Poniższy kod zadziała nawet jak w systemie nie mamy zainstalowanego ani jednego gemu Merba (z tego też powodu nie umieszczam go jako zadanie Rake’a) Skrypt należy skopiować do podkatalogu framework (choć można go lekko zmodyfikować aby działał z dowolnego katalogu). Cały kod sprowadza się do odpalenia od czasu poniższego skryptu.

#!/usr/bin/env ruby
%w(merb-core merb-more merb-plugins).each do |entry|
  puts "Updating git for #{entry}"
  system "cd #{entry}; git pull"
end
%w(merb-plugins/merb_* merb-more/merb-* merb-more merb-core).each do |entry|
  Dir.glob(entry).each do |dir| 
    system "cd #{dir}; rake repackage"
    system("sudo gem uninstall -a -i -x #{File.basename(dir)}") rescue Gem::InstallError 
    system "sudo gem install --no-rdoc --no-ri -f -l #{dir}/pkg/*"
  end
end

W tej metodzie nie musimy odpalać script/frozen-merb, wystarczy zwykła komenda merb. Powyższy skrypt dodałem do repozytorium Merba jako proponowane ulepszenie.

Najnowsza dokumentacja RDoc do merb-core umieszczona jest na http://blog.zabiello.com/merb-core/ (jest odświeżana co godzinę).

Tags  | no comments

Comments

(leave url/email »)

   Comment Markup Help Preview comment