Geschrieben von: Alexander Zeitler
Kategorie: .NET Allgemein
This printed page brought to you by AlphaSierraPapa
Eine in Entwicklerkreisen wohlbekannte Aussage bzw. Frage dürfte folgende sein: "Das hat doch schon funktioniert, warum funktioniert es jetzt nicht mehr?". Wie schön wäre es jetzt, den Stand des Quellcodes zur Verfügung zu haben, der funktionierte. Doch natürlich hat man in der Freude über die neu implementierten Features völlig vergessen, den Quellcode zu sichern.
Diese oder ähnliche Probleme hat sicher jeder von uns bereits erlebt. Doch das muß nicht sein - die Lösung heißt Versionsverwaltung.
Sie bietet die Möglichkeit jeden Entwicklungsschritt zurückzuverfolgen und auf jede gesicherte Version jeder zu dem Projekt gehörigen Datei zurückzugreifen. Dabei wird die Entwicklung im Team unterstützt und es ist mehreren Mitarbeitern eines Projekts möglich, gleichzeitig die gleichen Dateien zu bearbeiten.
Die derzeit sowohl preislich als auch funktionell interessanteste Software zur Versionsverwaltung stellt Subversion dar. Allerdings ist der Weg von der ersten Installation bis zum reibungsfreien Betrieb in einer .NET-Entwicklungsumgebung mitunter steinig. Einige Steine soll dieser Artikel aus dem Weg räumen.
Das Ziel dieses Artikels ist die Einrichtung eines Windows 2003 Servers mit Subversion mit mehreren Repositories, auf welche verschiedene User mit unterschiedlichen Rechten per Visual Studio .NET 2003 zugreifen können. Entgegen den Erwartungen läuft Subversion jedoch nicht mit dem IIS, weswegen wir den Apache Webserver benötigen. Da Visual Studio .NET normalerweise nur Microsoft Visual SourceSafe unterstützt benötigen wir für Visual Studio .NET noch ein Add-In: AnkhSVN. Ferner ist eine Administration auf Kommandozeilenebene nicht mehr zeitgemäß. Deshalb verwenden wir hierfür TortoiseSVN.
Somit ergibt sich also folgende Anforderungsliste:
Server:
Client:
Daß die Serverinstallation von Windows 2000 bzw. 2003 funktioniert hat, setze ich hier voraus.
Auch die Basis-Installation des Apache Webserver, der mindestens in der Version 2.0.48 vorliegen muß, sollte dank MSI-Installer keine Probleme bereiten - gleiches gilt für Subversion und TortoiseSVN.
Entscheidend komplexer stellt sich hingegen die Konfiguration des Apache Servers für die Zusammenarbeit mit Subversion dar.
Da auf einem Windows Server in aller Regel der Internet Information Server installiert ist und dieser wiederum auf Port 80 läuft, werden nach der Apache-Installation sicher Probleme auftauchen, da Apache ebenfalls versucht, Port 80 zu benutzen.
Die erste Konfigurationseinstellung, die wir deshalb ändern, ist der Port des Apache-Webservers. Diese Einstellung findet sich in der Datei httpd.conf, welche man entweder über das Startmenü oder nach einer Standard-Installation unter "C:\Program Files\Apache Group\Apache2\conf\httpd.conf" findet.
Der Eintrag findet sich unter dem Schlüsselwort "Listen" (also an welchem Port Apache "horchen" soll). Der aktuelle Eintrag:
Listen 80
ist zu ändern in:
Listen 8080
Danach sollte Apache ordnungsgemäß starten und seine Testseite wie folgt präsentieren:
Wenn Sie Subversion nach dem Apache Webserver installiert haben, sollte Subversion den Apache Server finden und die nachfolgenden Konfigurationseinstellungen selbständig vornehmen. Ist dies nicht der Fall, sind die folgenden Schritte zu erledigen, bevor wir ein Repository anlegen können:
Die Dateien mod_dav_svn.so und mod_authz_svn.so aus dem Verzeichnis C:\Program Files\Subversion\Apache2\modules sind in das Apache-Modules-Verzeichnis zu kopieren (C:\Program Files\Apache Group\Apache2\modules).
Weiterhin müssen die Dateien libdb42.dll , libeay32.dll und ssleay32.dll aus dem Verzeichnis C:\Program Files\Subversion\bin in das Apache-Modules-Verzeichnis kopiert werden.
Nun sind die Voraussetzungen geschaffen, um Subversion und Apache zusammenarbeiten zu lassen - allerdings weiß Apache noch nichts von Subversion, was wir jetzt durch einige Konfigurationseinstellungen ändern werden.
Zunächst muß hierzu ein neues Repository angelegt werden. Hierfür legen wir uns einen Ordner an, der alle Repositories aufnimmt, in unserem Falle verwende ich
D:\SVN
Unterhalb dieses Ordners ist nun noch ein Ordner für das eigentliche Repository nötig. Da unser (fiktives Artikel-)Projekt den Titel MyProject trägt, verwende ich diesen auch für den Ordner.
Das Anlegen des Repositories geschieht mittels TortoiseSVN durch einen Rechtsklick in dem Repository-Ordner "MyProject" auf die Option "Projektarchiv hier erstellen":
Damit ist das Anlegen des Repositories bereits erledigt und wir können uns wieder der httpd.conf des Apache zuwenden.
In dieser sollten sich die beiden Zeilen
#LoadModule dav_module modules/mod_dav.so
und
#LoadModule dav_fs_module modules/mod_dav_fs.so
befinden. Ist dies der Fall, sind bei beiden Zeilen die "#"-Zeichen zu entfernen. Sollten die Zeilen nicht existieren, sind diese ohne # hinzuzufügen.
Weiterhin sind am Ende der "LoadModule"-Auflistung folgende Zeilen hinzuzufügen:
LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so
Danach ist der Apache über den in der Systray abgelegten Apache Service Monitor neu zu starten:
Nun ist am Ende der httpd.conf folgendes einzufügen:
<Location /svn/MyProject> DAV svn SVNPath D:/SVN/MyProject AuthType Basic AuthName "MyProject Repository" AuthUserFile MyProjectpasswd Require valid-user </Location>
Nach einen Neustart des Apache ist das Repository von MyProject bereits über
http://localhost:8080/svn/MyProject
verfügbar. Allerdings nur für registrierte, heißt in der Paßwort-Datei "MyProjectpasswd" bekannte Benutzer. Da wir diese bisher weder definiert noch mit User-Accounts bestückt haben kann sich also noch niemand anmelden.
Damit dies nicht so bleibt erzeugen wir mit dem Kommandozeilen-Tool "htpasswd", welches sich im Verzeichnis \bin der Apache-Verzeichnisstruktur befindet ein neues Paßwort-File, dem wir auch gleich einen User "Alex" zuordnen.
Da wir die Paßwort-Datei im Root-Verzeichnis der Apache-Verzeichnisstruktur angegeben haben, müssen wir sie auch dort anlegen. Der Aufruf von htpasswd sieht deshalb wie folgt aus:
Wenn Sie weitere Benutzer hinzufügen möchten, muß htpasswd ohne die Option "-c" aufgerufen werden.
Damit ist ein Aufruf des Repositories nach einem weiteren Apache-Neustart ab sofort problemlos möglich.
Unter http://localhost:8080/svn/MyProject sollte sich folgendes Bild präsentieren:
Nach der Eingabe des Usernamen und Paßwort schließlich wird das (noch leere) Repository von MyProject im Browser dargestellt:
Somit steht einer weiteren Verwendung dieses Repositories für unser Projekt nichts mehr im Wege.
Die Integration von Subversion geschieht wie Eingangs bereits erwähnt, über das Add-In AnkhSVN, dessen Installation reibungslos durch den mitgelieferten Installer erfolgen sollte.
Verwendet man Subversion bzw. AnkSVN, um WinForm-Applikationen oder Webservices zu verwalten, stellt dies kein Problem dar - Subversion ist gemäß Handbuch verwendbar.
Anders gestaltet sich dies bei ASP.NET-Webanwendungen. Da Visual Studio.NET hier ein Problem mit Ordnern hat, deren Endung mit einem Punkt beginnen, stellt der obligatorische ".SVN"-Ordner in jedem Verzeichnis der Arbeitskopie unseres Repositories eine Hürde dar. Diese äußert sich beim Laden und Aktualisieren des Projektmappenexplorers wie folgt:
Die Fehlermeldung führt zwar nicht dazu, daß eine weitere Arbeit nicht mehr möglich ist, doch sie stört erheblich.
Abhilfe schafft die Verwendung von zwei Batchfiles, die in den jeweiligen Ordnern der Arbeitskopie abzulegen sind:
hide-svn.cmd: @ECHO OFF FOR /R %%f IN (.svn) DO IF EXIST "%%f" ( ATTRIB -h "%%f" RENAME "%%f" _svn )
restore-svn.cmd: @ECHO OFF FOR /R %%f IN (_svn) DO IF EXIST "%%f" ( RENAME "%%f" .svn ATTRIB +h "%%~pf\.svn" )
"hide-svn.cmd" ist vor dem Öffnen des Projekts in VS.NET aufzurufen. Die Batchdatei benennt dann den .SVN-Ordner in "_SVN" um und VS.NET kann das Projekt problemlos laden. Nach dem Laden kann man "restore-svn.cmd" aurufen, was den eben beschrieben Prozeß wieder rückgängig macht. Will man zwischendurch den Projektmappenexplorer aktualisieren, ist diese Prozedur wieder auszuführen.
Da dies zugegebenermaßen sehr umständlich ist, sollte man eine zweite, elegantere und vor allem dauerhaft einfach zu bedienende Lösung bevorzugen.
Hierzu ist allerdings einmalig etwas Feintuning sowie eine geänderte Arbeitsweise im Umgang mit ASP.NET-Projekten in VS.NET notwendig.
Neue ASP.NET-Projekte, die mit Subversion verwaltet werden sollen, dürfen nicht mehr als "ASP.NET-Webanwendung" verwendet werden, sondern müssen nach dem Anlegen in Lokale Projekte umgewandelt werden.
Um dies jedoch mit MyProject tun zu können, müssen wir es erst als ASP.NET-Webanwendung anlegen. Damit die sowohl die Projektinformationen als auch die eigentlichen Sourcecode-Dateien mittels Subversion verwaltet werden können, dürfen wir es jedoch nicht auf dem gewohnten Weg anlegen. Stattdessen ist zunächst im Visual Studio Projektordner, der normalerweise unter C:\Dokumente und Einstellungen\<BenutzerName>\Eigene Dateien\Visual Studio Projekte\ liegt händisch ein neuer Ordner "MyProject" anzulegen.Danach wird im IIS-Manager ein neues virtuelles Verzeichnis mit dem Namen "MyProject" angelegt, welches auf den soeben angelegten Ordner verweist. Ein detailierte Anleitung finden Sie hier.
Nachdem das Web angelegt wurde, können wir nun in VS.NET eine neue ASP.NET-Webanwendung mit dem Namen "MyProject" anlegen:
Direkt im Anschluß können wir die erzeugte Projektmappe schließen. Das Projekt muß nun nachträglich in ein lokales Projekt umgewandelt werden. Hierzu ist die Datei C:\Dokumente und Einstellungen\<BenutzerName>\Eigene Dateien\Visual Studio Projekte\MyProject\MyProject.sln in einem Texteditor zu öffnen.
Die Zeile (nur der Lesbarkeit halber hier auf mehrere Zeilen verteilt)
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyProject", "http://localhost/MyProject/MyProject.csproj", "{42E73FAB-08AE-492E-B6D8-FB380EB43AF7}"
ist wie folgt zu ändern:
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyProject", "MyProject.csproj", "{42E73FAB-08AE-492E-B6D8-FB380EB43AF7}"
D.h. die Server-Information samt Pfadangaben ist zu löschen. Danach kann diese Datei gespeichert und geschlossen werden.
Sollte eine Datei mit der Endung ".webinfo" existieren, ist diese zu löschen.
Nun ist die Datei "MyProject.csproj" im gleichen Ordner in einem Texteditor zu öffnen.
Der Eintrag
ProjectType = "Web"
ist zu ändern in
ProjectType = "Local"
Danach kann auch diese Datei wieder geschlossen werden.
Wenn Sie nun "MyProject" wieder in VS.NET öffnen, werden sie zunächst bis auf ein verändertes Projektmappen-Symbol im Projektmappenexplorer keine Veränderungen feststellen.
Doch wenn Sie nun versuchen, ein neues Webform oder andere Web-bezogene Elemente hinzuzufügen, werden Sie sicher entsetzt feststellen, daß dies nicht mehr möglich ist.
Der Grund hierfür ist schlicht und ergreifend, daß VS.NET für den Projekttyp "Local" andere Vorlagen hinterlegt hat, als für den Projekttyp "Web". Deshalb müssen wir VS.NET nun auch für die lokalen Projekte die Webprojekt-Elemente zur Verfügung stellen.
Dies geschieht einfach dadurch, daß alle in der Datei C:\Programme\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems\WebProjectItems\WebProjectItems.vsdir stehenden Einträge in der Datei C:\Programme\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems\LocalProjectItems\LocalProjectItems.vsdir anzufügen sind. Für VB.NET oder andere Sprachen lauten die Ordner analog.
Nach einem Neustart von VS.NET und einem erneuten Aufruf von "MyProject" stehen nun die bekannten Elemente wieder zur Verfügung. Allerdings nicht wie gewohnt direkt im Kontextmenü der Projektmappe, sondern über den Kontextmenüeintrag "Neues Element hinzufügen...".
Was jetzt noch fehlt, um MyProject mit Subversion verwalten zu können, ist die Daten von MyProject in das bereits angelegte Repository auf unserem Server zu kopieren.
Hierzu ist zunächst ein initialer CheckOut durchzuführen, der eine Arbeitskopie unseres Repositories erzeugt. Der Aufruf geschieht in dem VS.NET-Ordner MyProject, in dem sich die Projektdateien befinden durch einen Rechtsklick, welcher TortoiseSVN ans Tageslicht befördert (Sie sollten den Rechner nach der Installation von TortoiseSVN neu starten, damit die Shell-Erweiterungen aktiviert werden):
Nach dem Klick auf "Auschecken" öffnet sich der folgende Dialog:
Ein Klick auf "Ok" zeigt uns nun einen Login-Dialog, den wir mit den auf dem Server angelegten Login-Daten versorgen:
Bei korrekter Eingabe sollte TortoiseSVN den CheckOut-Vorgang starten und dessen erfolgreichen Abschluß nach kurzer Zeit wie folgt bestätigen:
Nun fehlt nur noch der Import der bereits vorhandenen Dateien in das Repository, was einfach durch das markieren aller Dateien und Ordner (außer dem durch den CheckOut angelegten .SVN-Ordner) und einem anschließenden Rechtsklick und "Hinzufügen" gestartet wird:
Nach einem Klick auf "Ok" im unten dargestellten Dialog
werden die Files schließlich hinzufügt:
Damit die Dateien nun endgültig gespeichert werden, müssen sie noch auf den Server übertragen werden. Dies geschieht durch einen neuerlichen Rechtsklick und die Auswahl von "Übertragen":
Nach Eingabe der Log Meldung "Erster Import." und einem Klick auf "Ok" startet TortoiseSVN die Übertragung aller Projektdateien auf unseren Server. Dieser Vorgang kann je nach Umfang der Dateien und Verbindungsgeschwindigkeit einige Zeit in Anspruch nehmen und endet mit einer Bestätigung ähnlich der des CheckOut- oder des Hinzufügen-Vorgangs:
Wenn Sie MyProject nun in VS.NET öffnen, wird sich Ihnen zum ersten Mal AnkhSVN im Projektmappenexplorer präsentieren:
Hier stehen Ihnen nun die wichtigsten Funktionen zum Hinzufügen neuer oder Übertragen geänderter Dateien direkt in Visual Studio .NET zur Verfügung.
Damit sind wir am Ende der Installation von Subversion und seinen Utilities in einer .NET Entwicklungsumgebung angekommen. Wenn Sie sich nun zu Recht fragen, wie Subversion, TortoiseSVN oder AnkhSVN denn zu bedienen sind, muß ich Sie an das bereits erwähnte SVN-Book sowie die jeweils verfügbaren Programmdokumentationen verweisen. Alleine das SVN-Book ist bereits über 250 Seiten dick und würde den Rahmen eines Artikels sprengen.
This printed page brought to you by AlphaSierraPapa
AnkhSVN
http://ankhsvn.tigris.org/servlets/ProjectDocumentList?folderID=1520
Apache Webserver
http://httpd.apache.org/download.cgi
Subversion
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
SVN-Book
http://svnbook.red-bean.com
TortoiseSVN
http://tortoisesvn.tigris.org/servlets/ProjectDocumentList?folderID=616
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.