Wie ich bereits vor einigen Tagen angekündigt habe, mußte ich mir eine Strategie überlegen, wie ich meine Visual-Studio-Projekte aus einer virtuellen Maschine herausbekomme, ohne ständig selbst daran zu denken. In diesem Artikel möchte ich kurz das Ergebnis meiner Überlegungen darstellen.
Das Problem
Ich habe auf meinem Mac ein Windows 7 in einer Virtual Box am laufen. Damit entwickle ich in erster Linie unter Verwendung des Visual Studio 2010. Wie sich nun herausgestellt hat, kommt das VS nicht unbedingt damit klar, wenn Projekte auf einem Netzlaufwerk liegen. Genau das war bisher der Fall, den Dokumente-Ordner hatte ich auf eine Freigabe gelegt, die von VirtualBox zur Verfügung gestellt wurde.
Die Alternative
Microsoft liefert seit einiger Zeit eine Kommandozeilen-Anwendung namens robocopy aus, die ähnlich wie rsync dazu in der Lage ist, Verzeichnisse zu synchronisieren. Dieses Tool und dessen Fähigkeit, auch auf Netzlaufwerke zu sichern, mache ich mir nun zunutze, um das Projektverzeichnis des Visual Studios aus der virtuellen Maschine heraus zu sichern.
Das Vorgehen
Zunächst habe ich eine Freigabe namens “visualstudio” in der VirtualBox angelegt und auf ein Verzeichnis in meinen Benutzerordner auf dem Mac verwiesen. Hierbei wird auf das automatische Einbinden in die VM verzichtet.
Alle weiteren Einstellungen finden innerhalb der virtuellen Maschine, also im Windows 7 direkt statt. Dort habe ich zunächst eine Batchdatei namens logon.bat in meinem Benutzerverzeichnis erstellt. Diese hat den folgenden Inhalt:
robocopy "%UserProfile%\Documents\Visual Studio 2010\Projects" "\\vboxsrv\visualstudio" /MIR /MON:1 /MOT:1 /NP /R:10 /W:30 /XD VSMacros80 /LOG+:%UserProfile%\robocopy.log
Der Befehl in dieser Datei führt dazu, daß robocopy während der gesamten Zeit im Hintergrund läuft und regelmäßig den Projektordner auf die zuvor angelegte Freigabe sichert. Die grundlegende Syntax für robocopy sieht dabei wie folgt aus:
robocopy [Quelle] [Ziel] [Optionen]
Quelle und Ziel können lokale Verzeichnisse oder Verzeichnisse auf Netzlaufwerken sein, wobei diese nicht einmal eingebunden sein müssen. Genau das mache ich mir an der Stelle auch zunutze, denn die Freigabe bleibt im Windows unsichtbar, wenn sie direkt angegeben wird. Die weiteren Optionen haben folgende Bedeutung: MIR spiegelt eine Verzeichnishierarchie 1:1 auf das Ziel, Daten die auf am Ziel, aber nicht an der Quelle vorhanden sind, werden gelöscht. MON und MOT sorgen für eine andauernde Überwachung (eine Änderung, eine Minute). Die Option R sorgt für eine begrenzte Anzahl von Versuchen bei Netzwerkproblemen und W gibt die Wartezeit in Sekunden zwischen den einzelnen Versuchen an. Mit XD können Verzeichnisse von der Synchronisierung ausgeschlossen werden. Mit LOG+ kann schließlich eine Logdatei angegeben werden, die zwingend lokal liegen muß. Zuletzt unterdrückt NP die Ausgabe eines Fortschrittsbalkens in dieser Logdatei. Für eine vollständige Liste aller Optionen sei auf den heise-Artikel Replikator verwiesen.
Nachdem die Batchdatei angelegt ist, muß sie nun noch als Anmeldeskript eingestellt werden. Dies geschieht mit dem Editor für lokale Gruppenrichtlinien, der über Start -> Ausführen -> gpedit.msc gestartet werden kann. Dort navigiert man zum Knoten Benutzerkonfiguration -> Windows-Einstellungen -> Skripts (Anmelden/Abmelden) und öffnet mit Doppelklick auf den Eintrag “Anmelden” den zugehörigen Dialog. Mit Klick auf den Button “Hinzufügen” kann der Pfad zur Batchdatei angegeben werden. Dies sollte nicht absolut, sondern relativ geschehen, also %UserProfile%\logon.bat. Folgendes Bild stellt diese Konfiguration noch einmal anschaulich dar:

Ab sofort wird dann robocopy bei jeder Anmeldung gestartet und überwacht unsichtbar im Hintergrund das angegebene Verzeichnis. Änderungen werden aufgrund der Einstellungen praktisch sofort auf die Freigabe gespiegelt.
Letzte Kommentare