Marko Apfel - Afghanistan/Belgium/Germany

Management, Architecture, Programming, QA, Coach, GIS, EAI

  Home  |   Contact  |   Syndication    |   Login
  187 Posts | 2 Stories | 201 Comments | 4 Trackbacks

News



Twitter | LinkedIn | Xing

Archives

Post Categories

Image Galleries

BizTalk

C#

Enterprise Library

SAP

SQL Server

Technologie

Motivation

Wie gehen Sie in dieser Situation vor:

Eine von Ihnen verwendete .NET-Drittbibliothek liegt in einer neuen Version vor und Sie müssen die Abhängigkeiten in all Ihren Projekte aktualisieren.

Je nach Projekt und Notwendigkeit hatten wir bei ESRI Deutschland dafür bisher u.a. folgende Lösungs-Szenarien:

  • Policy-Files
    Sie dienen zum „Umbiegen“ der von den eigenen Projekten verwendeten Version auf die aktuelle. Das geht allerdings nur bei GAC-basierenden Assemblies und die sollte man aus diversen Gründen versuchen zu meiden[1].
  • Globaler Assembly-Resolve-Handler
    Dieser Ansatz bietet kein generisches Lösungsrezept für alle Ausgangssituationen und bedarf auch einer zusätzlichen Verwaltungs-Logik die eigentlich nicht in Programmcode gehört.
  • Neutralisieren der Assembly Referenzen per Hand und neues Einspielen der aktuellen Drittbibliotheken in das entsprechende Verzeichnis
    Damit hat man zwar die zu bindende Version durch die Version der eingespielten Assemblies manifestiert, aber man verliert die Hoheit über Identifikationsinformationen. Dieses Vorgehen erfordert eine ständiges Nachbearbeitung der Projektdateien und ist daher auch fehleranfällig und aufwendig.

Was eigentlich gesucht ist: ein simpler durchgängiger Mechanismus, mittels dessen ein Satz von Drittbibliotheken aktualisiert werden kann mit einer einfachen Möglichkeit die Referenzen in den eigenen Projekte auf die neue Version zu heben.

Wenn Sie mit ArcObjects entwickeln, haben Sie mindestens schon indirekt mit der Variante Policy-Files gearbeitet. Allerdings hat Ihnen dabei ESRI Inc. die Arbeit abgenommen und selbst die entsprechenden Regeln mit den Updates ausgerollt.

Intro NuGet

Es liegt nahe, dass nicht nur ArcObjects-Programmierer mit dieser Situation konfrontiert sind. Und daher war es auch nur eine Frage der Zeit, dass findige Köpfe eine Lösung etablieren werden. Interessanterweise kommt eine aus dem Umfeld von Microsoft in freier Form: NuGet[2] (ehemals NuPack).

NuGet kann sowohl als Addin innerhalb von Visual Studio 2010 als auch als ein Satz von CMD- und PowerShell-Kommandos verwendet werden. Letzteres ist natürlich insbesondere interessant für Aktualisierungs-Workflows auf einem Continuous Integration Server ohne Visual Studio.

Für Visual Studio lässt sich NuGet am einfachsten mittels des Extension Managers installieren.

Prozess

Paketierung

Der erste Schritt besteht in der Paketierung der ArcObjects-Bibliotheken zu einem verwaltbaren Paket. Das sollte man am besten als ein eigenes Projekt im organisatorischen Sinne verstehen (nicht im Sinne eines Visual Studio Projektes). Aus Gründen der Nachvollziehbarkeit sollte dieses Projekt natürlich in einem Versioning Control System wie SubVersion oder Git liegen.

Die Paketierung ist recht simpel: Man kopiert alle benötigten ArcObjects-Bibliotheken in einen speziellen Unterordner des Projektes namens lib.

Parallel zu lib legt man eine NuGet-Paket-Beschreibung (*.nuspec). Eine leere Hülle lässt sich mit dem Kommando NuGet spec erzeugen. Das Format dieser Datei kann auf der Dokumentationsseite von NuGet nachgeschlagen werden[3]. Insbesondere das Tag Version ist nun von Interesse. Hier setzt man am besten die relevante ArcObjects-Version ein (z.B. 10.0).

Mittels NuGet pack kann nun das Paket für diese Paket-Beschreibung erzeugt werden. Als Ergebnis erhält man eine *.nupkg Datei – das eigentliche Paket.

Drop-Location

Dieses Paket sollte nun in einem öffentlichen Verzeichnis zur Verfügung gestellt werden, damit es vom NuGet-Package Manager für Aktualisierungen berücksichtigt werden kann. Dazu kann im einfachen Fall ein Share-Laufwerk verwendet werden oder etwas komplexer ein privater Feed. Ein entsprechendes Beispiel für den Aufbau eines Web-Projektes mit Feed-Veröffentlichung findet sich in den NuGet-Demos[4].

Pakete mit öffentlichem Charakter können auch in das freie NuGet-Repository publiziert werden – aus lizenzrechtlichen Gründen sollte man dies aber bei ArcObjects-Paketen tunlichst unterlassen.

Package Manager Konfiguration

Damit der NuGet Package Manager dieses eigene Paket auch findet, muss ihm der Ort der eigenen Pakete bekannt gemacht werden. Dazu kann man die Package Manager Settings erweitern - im einfachsten Falle eben um das eigene Share-Verzeichnis (siehe Abb. – Quellenkonfiguration).

Package Verwendung

Bis hierher wurden nur Grundlagen erschaffen, die nun zukünftig in allen weiteren Projekten verwendet werden – wir kommen also zum eigentlich interessanten Teil des Workflows.

Und dieser ist unglaublich einfach: Statt in einem Projekt „Add Referenz“ für die Referenzierung eines Assemblies auszuführen, bietet Visual Studio nun einen neuen Menüpunkt „Manage NuGet Package“ an (siehe Abb. – Referenzen hinzufügen).

Über diesen kommt man zu einem Dialog der in ähnlicher Form schon vom Extension Manager ist. Und so ähnelt sich die Verwendung auch – man hat eine Liste der verwendbaren, verwendeten und aktualisierbaren Pakete sowie Verwaltungsmöglichkeiten dieser Pakete in den jeweiligen Projekten (siehe Abb. – Package Verwaltung).

Letzte Option allerdings nur, wenn man den Manager über den Solution-Knoten und nicht über einen Projekte-Knoten im Solution Explorer öffnet.

NuGet bindet daraufhin alle im Paket genannten Assemblies in das jeweilige Projekt ein. Man braucht sich dabei keine Gedanken darüber zu machen, wie man die möglicherweise zu viel angegebenen Assemblies aus einem Paket wieder entfernt. Das braucht man nämlich gar nicht – der Compiler ist clever genug in den Metadaten nur die tatsächlich verwendeten Bibliotheken anzubinden.

Aktualisierungen

Für die Aktualisierung muss man als erstes einmal die aktualisieren Bibliotheken in das lib-Verzeichnis des Package-Projekt einspielen und das Version-Tag in der *.nuspec-Datei anpassen. Danach wird wie oben beschrieben ein neues Paket erstellt und wieder im Share-Laufwerk zur Verfügung gestellt. Das alte Paket sollte nicht gelöscht werden – vielleicht braucht man diese Version noch in anderen Solutions.

Nach einem erneuten Öffnen des Dialogs „Manage NuGet Packages“ steht die Aktualisierung in der Update-Liste (siehe Abb. – Zur Verfügung stehende Paket-Aktualisierungen).

Wählt man das Update aus, werden von NuGet automatisch alle Projekte mit Verwendung des jeweiligen Paketes aktualisiert – das betrifft dann sowohl den Download des Paketes mit Entpacken in das Bibliothek-Verzeichnis als auch die Aktualisierung aller Visual Studio Projektdateien (z.B. *.csproj).

Ausblick

Seitens ESRI Inc. wurden bis zur 9er-Version der ArcObjects immer Policy-Files mit installiert. Sie trugen dafür Sorge, dass Applikationen beim Anfordern von ArcObjects-Assemblies immer die neueste Version geladen haben.

Unter 10 wurde dieses Konzept nicht weiter geführt um u.a. eine side-by-side Installation verschiedener ArcObjects-Versionen zu ermöglichen. Dies ist insbesondere beim dedizierten Lifecycle-Management von ArcGIS Desktop und ArcGIS Engine Applikationen ein absolutes Muss.

Dementsprechend müssen wir Entwickler nun gegen eine bestimmte Version kompilieren und die Verwendung der Versionen in unseren Projekte auch verwalten. Für diese Aufgabe kann NuGet eine ideale Basis sein.

Links

[1] GAC-Fallstricke
http://en.wikipedia.org/wiki/Global_Assembly_Cache#Pitfalls
[2] NuGet
http://www.nuget.org
[3] NuGet Dokumentation
http://docs.nuget.org/
[4] NuGet Demos
http://docs.nuget.org/docs/start-here/videos
http://channel9.msdn.com/Events/MIX/MIX11/FRM09 ab ca. 50. Minute


Marko Apfel
ESRI Deutschland GmbH
Kranzberg


m.apfel (at) esri.de
http://geekswithblogs.net/mapfel

posted on Friday, July 22, 2011 10:48 AM

Feedback

# re: NuGet-Package-Management mit ArcObjects 7/25/2011 8:08 AM florists bhopal
There are three basic kinds of nougat: The first, and most common, is white nougat (which appeared in Anacreon, Italy in the early 15th century and later in Montpelier, France.

# re: NuGet-Package-Management mit ArcObjects 7/25/2011 11:07 AM modewelt
Vielen Dank für die mir die dringend benötigte Inspiration

Post A Comment
Title:
Name:
Email:
Comment:
Verification: