App Templates – szybki start tworzenia aplikacji
Andrzej Śliwa - 2 stycznia 2010
Ruby on Rails z wersji na wersję podlega naturalnej ewolucji. Jest to proces ciągły, oparty na reagowaniu jego użytkowników na nowe wymagania stawiane przed frameworkiem. Aktualna gałąź 2.3 wprowadza szereg udogodnień związanych między innymi z automatyzacją procesu tworzenia aplikacji. Wprowadzono prosty język DSL za pomocą którego jesteśmy w stanie projektować własne szablony. Szablony te mogą się na wzajem wywoływać co pozwala na modułowe wykorzystanie.
Przykład szablonu automatyzującego dodawanie aplikacji do repozytorium GIT:
log 'GIT template', 'Starting template'
unless self.respond_to?(:already_using)
template = ENV['TEMPLATE_BASE'] || 'http://github.com/andrzejsliwa/config/raw/master/templates'
load_template("#{template}/helpers_methods.rb")
@stand_alone = true
end
already_using('.git/config', 'GIT')
# Remove temp directories.
%w[cache pids sessions sockets].each do |dir|
rmdir "tmp/#{dir}"
end
# Remove unnecessary files.
%w[index.html favicon.ico robots.txt].each do |file|
rm "public/#{file}"
end
rm 'doc/README_FOR_APP'
# Hold empty directories touching a .gitignore file
run("find . \\( -type d -empty \\) -and \\( -not -regex ./\\.git.* \\) -exec touch {}/.gitignore \\;", false)
# Copy database.yml for reuse
cp 'config/database.yml', 'config/database.yml.example'
# Create root .gitignore file from template
config_file '.gitignore'
git :init
if @stand_alone
# Initial commit
git :add => "."
git :commit => "-a -m 'initial import.'"
end
log 'GIT template', 'Successfully applied template'
Użycie przykładowego szablonu może odbywać się na 2 sposoby:
w trakcie tworzenia aplikacji:
$ rails application_name
-m http://github.com/andrzejsliwa/config/raw/master/templates/git.rb
w dowolnym momencie wykorzystując wbudowany task Rake’a:
$ rake rails:template
LOCATION=http://github.com/andrzejsliwa/config/raw/master/templates/git.rb
Zapraszam do zapoznania się z tym mechanizmem, umiejętnie wykorzystany może zaoszczędzić nam mnóstwo czasu związanego z konfiguracją aplikacji.
Na koniec przykład pliku szablonu nad którym obecnie jeszcze pracuję, a który ma zautomatyzować konfigurację aplikacji pod Cucumber / Rspec oraz Authologic. Skrypt ten wykorzystuje wyżej prezentowany git.rb
:
log 'BASE template', 'Starting base template'
template = ENV['TEMPLATE_BASE'] || 'http://github.com/andrzejsliwa/config/raw/master/templates'
unless self.respond_to?(:already_using)
load_template("#{template}/helpers_methods.rb")
end
gem 'authlogic', :version => '>=2.1.3', :lib => false
gem 'gemcutter', :version => '>=0.2.1', :lib => false
gem 'rcov', :version => '>=0.9.7', :lib => false, :env => 'test'
gem 'database_cleaner', :version => '>=0.4.0', :lib => false, :env => 'test'
gem 'webrat', :version => '>=0.6.0', :lib => false, :env => 'test'
gem 'rspec', :version => '>=1.2.9', :lib => false, :env => 'test'
gem 'rspec-rails', :version => '>=1.2.9', :lib => false, :env => 'test'
gem 'cucumber', :version => '>=0.5.3', :lib => false, :env => 'test'
gem 'cucumber-rails', :version => '>=0.2.2', :lib => false, :env => 'test'
gem 'autotest', :version => '>=4.1.4', :lib => false, :env => 'test'
gem 'autotest-rails', :version => '>=4.1.0', :lib => false, :env => 'test'
gem 'autotest-fsevent', :version => '>=0.1.3', :lib => false, :env => 'test'
gem 'autotest-growl', :version => '>=0.1.7', :lib => false, :env => 'test'
gem 'ZenTest', :version => '>=4.2.1', :lib => false, :env => 'test'
gem 'factory_girl', :version => '>=1.2.3', :lib => false, :env => 'test'
gem 'email_spec', :version => '>=0.3.8', :lib => "email_spec", :env => 'test'
rake 'gems:install', :env => 'test'
rake 'gems:install'
# We don't like unittest;)
rmdir_r "test"
# Get database.yml file
database_yml(:postgresql)
# Run required generators
generate :cucumber
generate :rspec
generate :email_spec
gem 'email_spec', :version => '>=0.3.8', :lib => "email_spec", :env => 'cucumber'
# Get .autotest config file
config_file '.autotest'
rakefile 'rcov.rake', get_source('lib/tasks/rcov.rake')
spec 'rcov.opts'
spec 'spec_helper.rb'
features 'support/env.rb'
rake 'db:create:all'
rake 'db:migrate'
rake 'db:test:load'
load_template("#{template}/haml.rb") if yes?("enable HAML?")
@is_git = yes?("enable GIT?")
load_template("#{template}/git.rb") if @is_git
if @is_git
# Initial commit
git :add => "."
git :commit => "-a -m 'initial import.'"
end
log 'BASE template', 'Successfully applied template'
Wszystkie aktualne źródła znajdują się tutaj:
http://github.com/andrzejsliwa/config/tree/master/templates/
Lektura obowiązkowa:
http://asciicasts.com/episodes/148-app-templates-in-rails-2-3
http://m.onkey.org/2008/12/4/rails-templates
http://guides.rubyonrails.org/2_3_release_notes.html
http://andrzejsliwa.com/2010/01/02/szablony-czyli-jak-zautomatyzowac-tworzenie-aplikacji/
Andrzej Śliwa
Programista, pasjonat, scrum master, konsultant IT.
Pasjonuje się językami dynamicznymi, metodami wytwarzania oprogramowania oraz metodologiami prowadzenia projektów, szczególnie dbający o jakość wytwarzanych rozwiązań. Obecnie koncentruje się na rozwoju w zakresie wykorzystywania frameworka Ruby on Rails, skalowanych rozwiązań, cloud computingu i języków funkcyjnych.
Comments