Eigene NAnt Plugins schreiben

NAnt ist praktisch 😀
In meinem CI und Build-Prozess benutze ich NAnt inzwischen zum erstellen der Dokumentation, das Obscufactieren der Assembys und für das anschlißende packen und FTP-upload selbiger.

In Verbindung mit CruiseControl.net kann man die NAnt ausgaben und timings im CC.NET Dashboard nett anschauen.

Hierfür habe ich in meiner NAnt Config so etwas stehen:

1
2
3
4
5
6
7
8
9
10
11
<!-- ################################################################################
	Info:
-->
<target name="Info">
	<echo message="--------------------------------------------------------------------" />
	<echo message="Mein Buildserver CC.NET (buildserver.domain.intern)" />
	<echo message="2009 by Sven Schmalle" />
	<echo message="Projekt: EStorm" />
	<echo message="Beschreibung: Dies ist ein Allgemeines Test-Projekt" />
	<echo message="--------------------------------------------------------------------" />
</target>

Das wäre der Abschnitt aus der Config des NAnt-Buildscript für das EStorm-Testprojekt.

Ausschauen tut das ganze dann so:

Buildfile: file:///C:/Projekte/EStorm/nant.build
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: Info

Info:
[echo] --------------------------------------------------------------------
[echo] Mein Buildserver CC.NET (buildserver.domain.intern)
[echo] 2009 by Sven Schmalle
[echo] Projekt: EStorm
[echo] Beschreibung: Dies ist ein Allgemeines Test-Projekt
[echo] --------------------------------------------------------------------

Ich fand mehrere Dinge hieran eher Suboptimal gelungen:
– Das „[echo]“ identifiniert nicht eindeutig aus welchem Task die Ausgabe kommt
– Man muss diesen Config-Abschnitt für JEDES Buildfile neu schreiben und ändern, wenn Änderungen vorgenommen werden.

Außerdem wollte ich noch, dass System-Informationen wie HDD Auslastung und so etwas angezeigt werden.
Hierfür habe ich mir nun ein eigenes NAnt-Plugin geschrieben.

Eigene NAnt Plugins zu schreiben ist recht einfach.
Nach dem man bei Google und auf der NAnt Seite gelesen hat, weiss man die elementaren Dinge, die man dazu braucht.
Ein NAnt-Plugin ist ein Projekt vom Typ „Klassenbibliothek“ – eine DLL 🙂
In dieser muss ein Verweis auf die „NAnt.Core.dll“ der NAnt-Installation gesetzt werden.
Ist dies geschehen, kann man schon los legen das Plugin zu bauen 🙂

Im einfachsten Fall, wollen wir jetzt unsere Ausgabe von oben durch das Pluin ausgeben lassen.
Hierfür habe ich mal folgenden Code vorbereitet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Text;
using NAnt.Core;
using NAnt.Core.Attributes;
 
 
namespace tA.NAnt.SysInfo
{	
	[TaskName("sysinfo")]
	public class SysInfo : Task
	{
		protected override void ExecuteTask()
		{
			Log(Level.Info,"--------------------------------------------------------------------");
			Log(Level.Info,"Mein Buildserver CC.NET (buildserver.domain.intern)");
			Log(Level.Info,"2009 by Sven Schmalle");
			Log(Level.Info,"Projekt: "+Project.ProjectName);
			Log(Level.Info,"Beschreibung: Dies ist ein Allgemeines Test-Projekt");
			Log(Level.Info,"--------------------------------------------------------------------");
		}
	}
}

Hier benutzen wir schon die Eigenschaft „Project.ProjectName“, welches uns das aktuelle Projekt ausgibt.
Gut – nun haben wir die DLL, also unser erstes Plugin fertig.
Wir müssen darauf achten das wir der DLL einen Namen geben, der mit *.tasks endet, da NAnt im Anwendungsverzeichnis alle DLL´s, welche mit *.tasks enden als Plugins läd.
Ich habe mich für den Namen „NAnt.SysInfo.Tasks.dll“ der DLL entschieden.
Diese kopieren wir jetzt in das Anwendungsverzeichnis von NAnt.

Jetzt müssen wir unser NAnt-Buildfile natürlich noch so ändern, dass das Plugin auch benutzt wird.
Mein Buildfile sieht nach der Änderung so aus:

1
2
3
4
5
6
<!-- ################################################################################
	Info:
-->
<target name="Info">
	<sysinfo />
</target>

Unschwer zu erkennen, haben wir jetzt immernoch den „Info“-Task, indem wir aber nur noch unser Plugin über den Namen des Plugins aufrufen.
Die Ausgabe von NAnt, wenn das Buildscript läuft wäre nun folgende:

Buildfile: file:///C:/Projekte/EStorm/nant.build
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: Info

Info:
[sysinfo] --------------------------------------------------------------------
[sysinfo] Mein Buildserver CC.NET (buildserver.domain.intern)
[sysinfo] 2009 by Sven Schmalle
[sysinfo] Projekt: EStorm
[sysinfo] Beschreibung: Dies ist ein Allgemeines Test-Projekt
[sysinfo] --------------------------------------------------------------------

Das wäre der Beweis, dass der Info-Task auch wirklich unser Sysinfo-Plugin aufruft.
Das wäre es auch schon 🙂

Als nächstes Schreibe ich irgendwann mal noch auf, wie man dem Plugin etwas mit Parametern übergeben kann – und dann kann man schon recht schöne eigene Plugins bauen, die man alltäglich benutzen kann.

Ja… @Benjamin – Kannst du für dein Hudson sowas auch machen? 😛

leave your comment


*

Unterstütze den Frickelblog!