09 stycznia 2008

Buildr jeszcze raz - tym razem start udany

Już miałem jedno niepomyślnie zakończone podejście do Buildr oraz Raven - Raven, Buildr i...JPA - nieudany start. Mimo początkowej porażki wciąż pamiętałem o obietnicach jakie składały te narzędzia, gdzie bolączki mavenowe miały odejść w zapomnienie raz na zawsze (prawdopodobnie przynosząc inne, ale inne będą nowe, a starych mam dość). I właśnie podczas wczorajszego, XXI spotkania Warszawa JUG na moment rozgorzała dyskusja na temat "Jeśli nie Maven, to co?". I faktycznie. Alternatywą mogłyby być Ant czy make, ale według mnie one są jedynie dobre, podczas gdy Maven jest lepszy, przyjemniejszy (coś na wzór porównania C z C++, żeby nie napisać Java - wszystkie są dobre, ale niektóre przypadają do gustu szybciej niż inne). Postanowiłem dzisiejszy wieczór spędzić rozpoznając Raven i Buildr ponownie.

Zacząłem od Ravena. Coś mi mówiło, że należy zaczać od niego. Po chwili już było wiadomo, że już po nim. Strona domowa nie zachęca do odwiedzin, gdzie widnieje Latest version: 1.2.3 (2007-05-12), a na liście dyskusyjnej raven-user głusza, jakby zamarła. Przedostatnia wiadomość jest jakby potwierdzeniem przypuszczenia, że ten projekt, albo dopiero rozpoczyna swoje istnienie (czemu przeczy jego wersja 1.2.3), albo właśnie je zakończył:

Kevin Williams wrote:
> Is Raven dead? JRuby 0.9.1 is quite out of date. JRuby 1.1 should be
> out any day. Will Raven be kept in sync with JRuby?
>
I believe it was killed by buildr.

Skoro nie Raven to pozostaje wskazany Buildr. Wyprzedzając fakty, szybko okazało się, że od niego powinienem zacząć.

Po pierwsze jest to projekt spod parasola ASF, więc rokuje nadzieje na zaistnienie. Po drugie, pobieżna lektura dokumentacji utrwala mnie w przekonaniu, że warto się zainteresować tym projektem, gdyż jego główną zaletą jest tworzenie konfiguracji programując w JRuby. Zero XMLa, którego powoli mam dosyć.

Akurat wczoraj wyszła nowa wersja JRuby 1.1 RC1, więc czym prędzej zabrałem się do instalacji JRuby, aby z nim uruchomić Buildr.

Zgodnie z Getting Started rozpoczynam od polecenia gem install buildr.

jlaskowski@dev ~
$ type gem
gem is /cygdrive/c/apps/jruby/bin/gem

jlaskowski@dev ~
$ gem install buildr
Error opening script file: C:/apps/cygwin/home/jlaskowski/cygdrive/c/apps/jruby/bin/gem (The system cannot find the path specified)

Szybko okazuje się, że rozwiązaniem jest skorzystanie z polecenia gem z projektu rubygems 1.0.1. Instalacja najnowszego wydania rubygems, ustawienie PATH i ponowne podejście.

jlaskowski@dev ~
$ export PATH=`cygpath -u C:/apps/rubygems/bin`:$PATH

jlaskowski@dev ~
$ type gem
gem is /cygdrive/c/apps/rubygems/bin/gem

jlaskowski@dev ~
$ gem

RubyGems is a sophisticated package manager for Ruby. This is a
basic help message containing pointers to more information.

Usage:
gem -h/--help
gem -v/--version
gem command [arguments...] [options...]

Examples:
gem install rake
gem list --local
gem build package.gemspec
gem help install

Further help:
gem help commands list all 'gem' commands
gem help examples show some examples of usage
gem help platforms show information about platforms
gem help show help on COMMAND
(e.g. 'gem help install')
Further information:
http://rubygems.rubyforge.org

jlaskowski@dev ~
$ gem install buildr
Updating metadata for 548 gems from http://gems.rubyforge.org
.................................................................................
.................................................................................
.................................................................................
complete
Building native extensions. This could take a while...
Successfully installed rjb-1.1.1
Successfully installed buildr-1.2.10
2 gems installed
Installing ri documentation for buildr-1.2.10...
Installing RDoc documentation for buildr-1.2.10...

Kolejnym krokiem jest stworzenie projektu nadzorowanego przez Buildr. Tu chwila wahania, gdyż nie jestem przekonany, czy projekt powinien już być stworzony (podobnie jak w przypadku Ant), czy mogę go utworzyć na podobieństwo działania archetype w maven. Na razie nie mam odpowiedzi, ale kontynuuję poznawanie buildr.

jlaskowski@dev ~
$ buildr --help
Buildr 1.2.10

Usage:
buildr [-f buildfile] {options} targets...

Options:
--buildfile=FILE (-f)
Use FILE as the buildfile.
--environment (-e)
Environment name (e.g. development, test, production).
--freeze (-F)
Freezes the Buildfile so it always uses Buildr version 1.2.10
--help (-H)
Display this help message.
--nosearch (-N)
Do not search parent directories for the buildfile.
--quiet (-q)
Do not log messages to standard output.
--require=MODULE (-r)
Require MODULE before executing buildfile.
--trace (-t)
Turn on invoke/execute tracing, enable full backtrace.
--unfreeze (-U)
Unfreezes the Buildfile to use the latest version of Buildr
--version (-V)
Display the program version.

For help with your buildfile:
buildr help

Zgodnie z dokumentacją utworzeniem pliku konfiguracji projektu buildfile może zająć się sam buildr, więc częściowo już otrzymałem odpowiedź, że mogę zacząć z pustym katalogiem projektowym.

jlaskowski@dev /cygdrive/c/projs/sandbox/buildr-projekt
$ buildr
To use Buildr you need a buildfile. Do you want me to create one?:
1. From directory structure
2. Skip
? 1
Created /cygdrive/c/projs/sandbox/buildr-projekt/buildfile

jlaskowski@dev /cygdrive/c/projs/sandbox/buildr-projekt
$ ls -ltr
total 1
-rw-r--r-- 1 jlaskowski None 536 Jan 9 22:30 buildfile

jlaskowski@dev /cygdrive/c/projs/sandbox/buildr-projekt
$ cat buildfile
# Generated by Buildr 1.2.10, change to your liking
# Version number for this release
VERSION_NUMBER = "1.0.0"
# Version number for the next release
NEXT_VERSION = "1.0.1"
# Group identifier for your projects
GROUP = "buildr-projekt"
COPYRIGHT = ""

# Specify Maven 2.0 remote repositories here, like this:
repositories.remote << "http://www.ibiblio.org/maven2/"

desc "The Buildr-projekt project"
define "buildr-projekt" do

project.version = VERSION_NUMBER
project.group = GROUP
manifest["Implementation-Vendor"] = COPYRIGHT
end

Mam plik konfiguracji projektu, więc ponownie wywołuję buildr.

jlaskowski@dev /cygdrive/c/projs/sandbox/buildr-projekt
$ buildr
(in /cygdrive/c/projs/sandbox/buildr-projekt)
Building buildr-projekt
Testing buildr-projekt

Nie ma żadnego błędu, więc po cichu zakładam, że działa.

Pora na kolejną porcję dokumentacji buildr - Projects.

Wciąż poszukuję odpowiedzi na pytanie o strukturę katalogową projektu. Za czasów Ant należało samemu zadbać o strukturę katalogów i z nią związać (czytaj: manualnie utworzyć) plik build.xml, który był odpowiednikiem Makefile z make. Nie ukrywam, że ostatecznie zamierzałem użyć Mavena do utworzenia struktury katalogowej projektu, a na niej "posadowić" buildr. Pytanie wciąż pozostaje bez odpowiedzi.

Doszukałem się jednakże ciekawego zestawu artykułów, których źródłem był artykuł wprowadzający na InfoQ - Apache to incubate its first Ruby Project: Buildr - Ruby Build System for Java Projects. W zasadzie można powiedzieć, że wspomniany artykuł jest pierwszym jaki należy przeczytać, który wskaże kolejne, co ostatecznie pozwoli na zorientowanie się w sytuacji i podjęcie decyzji, czy Agile or Maven. A jest nad czym się zastanawiać, jeśli wierzyć:

It builds the same except that the scripts have been downsized by 91% from 52 XML abused files to 1 script. But that's not all, Buildr managed to cut the build time by 50%! Even on partial builds, Buildr performs similarly or better than Maven.

Dobrym wprowadzeniem w temat Buildr jest Recenzja Buildr, w którym dowiaduję się kolejnej potrzebnej rzeczy - buildr do dyspozycji udostępnia mam kilka(dziesiąt/set) gotowych do użycia zadań, jak np.

  • clean
  • compile
  • upload
  • install
  • javadoc
  • package
  • test
  • uninstall

W podsumowaniu pada ciekawe stwierdzenie, które zaczyna się u mnie materializować mimo braku doświadczenia z Raven i Buildr:

Overall I believe that Buildr is a much more likely to become the defacto ruby build language, than Raven. If simply because of the active community that Raven seems to lack. So if you are up to replacing the trainwreck that is Maven 2 then I would encourage you to look into Buildr.

Ciekawa uwaga.

Przypominam sobie, że właśnie uruchomienie buildr help wskazuje na dostępne i najczęściej stosowane zadania gotowe do użycia. I jest to napisane w pierwszym poleceniu jakie przyjdzie każdemu nowicjuszowi wykonać przy początkowym rozpoznawaniu buildr (!)

jlaskowski@dev /cygdrive/c/projs/sandbox/buildr-projekt
$ buildr help
(in /cygdrive/c/projs/sandbox/buildr-projekt)
Buildr 1.2.10

Usage:
buildr [-f buildfile] {options} targets...

Top-level projects (buildr help:projects for full list):
buildr-projekt # Moj pierwszy projekt zarzadzany przez Buildr - buildr-projekt

Common tasks:
artifacts # Download all artifacts
build # Build the project
clean # Clean files generated during a build
compile # Compile all projects
default # The default task it build
eclipse # Generate Eclipse artifacts for all projects
help:projects # List all projects defined by this buildfile
help:tasks # List all tasks available from this buildfile
idea # Generate Idea artifacts for all projects
install # Install packages created by the project
javadoc # Create the Javadocs for this project
junit:report # Generate JUnit tests report in reports/junit
package # Create packages
release # Make a release
test # Run all test cases
uninstall # Remove previously installed packages
upload # Upload packages created by the project


For help on command line options:
buildr --help

Using Java 1.5.0_14, Ant 1.7.0.

To run a full build without running any test cases:
buildr test=no
To run specific test case:
buildr test:MyTest
To run integration tests:
buildr integration

Okazuje się, że taką pomoc otrzymamy jedynie w projekcie zarządzanym przez buildr. Zresztą było to napisane przy buildr --help (trzeba było czytać dokumentację oraz wyniki poleceń dokładniej!):

For help with your buildfile:
buildr help

Na dzisiaj koniec, zasypiam z kilkoma pytaniami dotyczącymi Buildr jak np. czy struktura katalogów powinna istnieć przed wprowadzeniem buildr do projektu, czy buildr wspomoże mnie w tej kwestii oraz fundamentalne dla mnie pytanie, jak zbudować ear i uruchomić go na serwerze aplikacji. Istnieje gem dla GlassFish, więc światełko w tunelu jest (oby to było wyjście, a nie nadjeżdżający pociąg ;-)). Przy kolejnym podejściu z pewnością padną te i wiele innych (p)odpowiedzi.