Addio NAnt. Benvenuto Rake

In questi giorni ho iniziato la migrazione degli scripts che utilizziamo per eseguire le build. Come si capisce bene dal titolo del post fino ieri il build runner era NAnt quindi gli scripts dei file xml. Da oggi ho iniziato a convertire i file in xml in scritps ruby che poi vengono eseguiti da Rake.

Il motivo principale per fare questo è il passaggio da un Domain Specific Language esterno verso un Domain Specific Language interno.

Un Domain Specific Language è un mini-linguaggio adatto ad un problema specifico, in questo caso serve per descrivere i task necessari ad eseguire una build automatica in un server di continuos integration. Altri esempi di Domain Specific Language sono SQL e XSLT.

Per esempio SQL non è un linguaggio di programmazione pensato per essere usato in qualsiasi situazione. A nessuno, sano di mente, verrebbe in mente di fare text processing o calcoli differenziali in SQL. Ma allo stesso tempo questo linguaggio è ottimo per il suo scopo specifico, che è quello di fare interrogazioni su database. Ruby ben si presta alla costruzione di semplici DSL da utilizzare all’interno della proprio applicazione, grazie alla sua sintassi ed alle sue funzionalità di metaprogrammazione.

Parlando invece della differenza tra  DSL interni ed esterni bisognare ricordare che quelli interni sono spesso più accessibili perchè, a differenza di quelli esterni, non è necessario usare parsing o strane grammatiche. Inoltre per lavorare non si ha bisogno di strumenti particolari. Se si usa Ruby per realizzare un DSL interno si lavora con linguaggio Ruby e basta.

Ad esempio Rake è una libreria scritta in Ruby che sfrutta un DSL interno per eseguire build automiche. La cosa veramente interessante è la chiarezza e la semplicità che si riescono a mantenere anche quando le operazioni non sono banali. La grande differenza rispetto a NAnt (scritto in C# e configurato con un DSL esterno in xml) è la possibilità di creare script in puro ruby sfruttando quindi la potenza offerta dal linguaggio di programmazione.

Di seguito ho postato un semplice script che compila una solution (usando msuild), esegue tutti i test (usando mbunit & gallio) ed in futuro farà anche il deployment sul server di test (magari via FTP usando le librerie di Ruby).

task :default => :build

task :build => [:compile, :test, :deploy]

task :compile do
  params = '/t:Rebuild /nologo /v:m /p:Configuration=Release src\demo.sln'
  msbuid = 'C:\\WINDOWS\\Microsoft.NET\\Framework\\v3.5\\MSBuild.exe'
  sh "#{msbuid} #{params}"
end

task :test do
runner = 'tools\\Gallio\\Gallio.Echo.exe'
assemblies = FileList["src/**/bin/Release/*.Fixture.dll"]
extension = '' #'/e:TeamCityExtension,Gallio.TeamCityIntegration'
sh "#{runner} #{assemblies} #{extension}"
end

task :deploy do
    sh "echo Task not yet implemented!"
end

Per me questa migrazione ha diversi vantaggi:

  • serve per fare ordine e migliorare i build scripts
  • imparare Ruby ed usarlo per attività di produzione
  • dimenticarmi della terribile sintassi del build file di NAnt :)

Ad oggi per eseguire Rake sul proprio pc serve ancora installare l’interprete ruby. Quando IronRuby sarà pronto questa operazione non sarà più necessaria ed oltre alle librerie Ruby si potranno usare tutte le librerie disponibili per il framework .net. Mica male!

Technorati Tag: ,,,,