Frage

Ich habe einen Java-Hintergrund, damit ich gewohnt bin zu haben Maven alles Problem umgeht um das Herunterladen und Abhängigkeiten auf dem neuesten Stand zu halten. Aber in der .NET-Umgebung habe ich noch nicht einen guten Weg gefunden, alle diese externen Abhängigkeiten zu verwalten.

Das Hauptproblem dabei ist, dass ich Lösungen Masse produzieren und sie alle sind in der Regel auf dem gleichen Dritten DLL abhängig zu sein. Aber ich will nicht getrennte Kopien von jeder Komponente unter jeder Lösung halten. Also muss ich einen Weg, all die verschiedenen Lösungen auf dem gleichen Satz von DLL zu verknüpfen.

Ich erkennen, dass eine Lösung sein könnte, die externen Bibliotheken in einem „Bibliothek-Projekt“ enthält, die in allen Lösungen enthalten ist, und lassen Sie die anderen Projekte verweist sie durch. (Oder nur sicherstellen, dass die externe DLL aus dem gleichen Ort für alle Projekte verweisen.)

Aber sind es bessere Möglichkeiten, dies zu tun? (Vorzugsweise eine Art Plug-in für Visual Studio verwenden.)

Ich habe auf der Visual Studio Dependency-Manager und es scheint, wie ein perfektes Spiel, aber hat jemand versucht, es wirklich? Ich habe auch die .NET-Ports von Maven gesehen, aber leider war ich nicht zu sehr von der Status derjenigen beeindruckt. (Aber bitte gehen Sie vor und empfehlen sie jemand, wenn Sie denken, ich sollte ihnen eine zweite Chance geben.)

So was wäre der klügste Weg, um dieses Problem zu lösen?

Update:

Ich erkennen, dass ich brauchte, um zu erklären, was ich mit gemeint Verknüpfung mit dem gleichen Satz von DLL .

Eines der Dinge, die ich versuche, hier zu erreichen, ist zu vermeiden, dass die verschiedenen Lösungen verweisen verschiedene Versionen der einzelnen Komponenten. Wenn ich eine Komponente auf eine neue Version aktualisieren, sollte es für alle Lösungen beim nächsten Build aktualisiert werden. Das würde mich zwingen, um sicherzustellen, dass alle Lösungen mit den neuesten Komponenten auf dem neuesten Stand sind.

Update 2: Beachten Sie, dass dies ist eine alte Frage gestellt, bevor Tools wie NuGet oder OpenWrap existierte. Wenn jemand bereit ist, ein mehr zu bieten up-to-date, bitte gehen Sie vor und ich werde die akzeptierte Antwort ändern.

War es hilfreich?

Lösung

  1. einen Platz finden, die Baugruppen zu speichern. Zum Beispiel speichere ich die .Net Kernbaugruppen wie folgt:

    • <branch> \ netfx \ 2.0527\ *
    • <branch> \ netfx \ 3.0\ *
    • <branch> \ netfx \ 3.5\ *
    • <branch> \ netfx \ Silverlight 2\ *
    • <branch> \ netfx \ Silverlight 3\ *
  2. Mit der ReferencePath Eigenschaft in MSBuild (oder AdditionalReferencePath in Team Build) Ihre Projekte an den entsprechenden Pfaden zeigen. Aus Gründen der Einfachheit und einfache Wartung, habe ich 1 * .targets Datei, die über jedes solches Verzeichnis kennt; alle meine Projekte importieren diese Datei.

  3. Machen Sie Ihre Versionskontrollstrategie sicher (Verzweigung, Zusammenführung, lokale <-> Server Mappings). Hält die relativen Pfade zwischen Ihren Projekten und Ihre Referenzpfade konstant

EDIT

Als Reaktion auf die Aktualisierung in der Frage, lassen Sie mich einen weiteren Schritt:

4) Stellen Sie sicher, in jeder Projektdatei jeder Montage Referenz verwendet die volle .Net starken Namen und nichts anderes .

Bad:

<Reference Include="Microsoft.SqlServer.Smo">
  <SpecificVersion`>False</SpecificVersion>
  <HintPath>..\..\..\..\..\..\..\Program Files (x86)\Microsoft SQL Server\100\Shared\Microsoft.SqlServer.Smo.dll</HintPath>
</Reference>

Gut:

<Reference Include="Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />

Vorteile des letzteren Format:

  • wird eine HintPath in einer kollaborativen Entwicklungsumgebung zwangsläufig zu Situationen führen, in denen „es funktioniert für mich“, andere aber nicht. Vor allem Ihres Build-Server. Das Weglassen es zwingt Sie Ihre Referenzpfade korrekt zu erhalten, oder es wird nicht kompiliert werden.
  • einen schwachen Namen verwenden lädt die Möglichkeit der „DLL Hölle.“ Sobald Sie starke Namen verwenden, dann ist es sicher mehrere Versionen des gleichen Baugruppe in Ihren Referenzpfaden haben, da der Linker nur diejenigen geladen werden, die jedes Kriterium entsprechen. Darüber hinaus, wenn Sie einige Baugruppen an seinem Platz zu aktualisieren entscheiden (anstatt Kopien hinzuzufügen), dann werden Sie bei der Kompilierung von irgendwelchen Bruch Änderungen benachrichtigt werden anstelle von , wenn die Fehler beginnen kommen in.

Andere Tipps

Zusätzlich zu, was alle anderen sagen, ist es im Grunde kommt es auf zwei Dinge:

  1. Stellt sicher, dass alle Entwickler die gleichen Versionen von externen Bibliotheken haben
  2. Stellt sicher, dass alle Entwickler die externen Bibliotheken im selben Ort befinden müssen (zumindest in Bezug auf den Quellcode)

Wie Richard Berg weist darauf hin, können Sie ReferencePath und / oder AdditionalReferencePath verwenden, um # 2 zu lösen. Wenn Sie msbuild in Ihrem Build-Prozess unter Verwendung sind (in unserem Fall verwenden wir CruiseControl- anstelle von MS-Team beim Aufbau), können Sie auch ReferencePath, um es auf der Kommandozeile übergeben. Zur Lösung # 1, habe ich festgestellt svn: externals zu sein nützlich (wenn Sie mit SVN).

Meine Erfahrung mit Maven ist, dass es für die meisten Zwecke Art und Weise übertrieben ist.

Ich habe in der Regel eine separate Ordnerstruktur auf der Source-Control für extrenal oder interne Abhängigkeiten und diese filders haben die Baugruppen entsprechend bauen oder Versionsnummer zum Beispiel

public \ External \ Bibliotheken \ Nunit \ 2.6 \

oder

Public \ Internal \ Bibliotheken \ Logger \ 5.4.312 \

und in den Lösungen alle Projekte, die eine der Abhängigkeiten verwenden müssen, fügt nur ein Verweis auf diese Baugruppen in den öffentlichen internen oder extrenal Ordner.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top