Ich frage mich, ob es Heuristiken gibt, wann copy-local=true
Referenzen festgelegt werden sollen.
Wenn referenzierte Typen nur intern verwendet werden, kann ich festlegen copy-local
, true
aber wenn referenzierte Typen als Parameter oder Rückgabewerte angezeigt werden, auf die ich festgelegt habe copy-local
, false
und angeben, dass auf eine bestimmte Version der Abhängigkeit verwiesen werden soll, wenn meine Bibliothek verwendet werden soll?
Kann mir das jemand erklären?
quelle
Copy local wurde wirklich implementiert, um das lokale Debuggen zu unterstützen. Wenn Sie Ihre Anwendung für Paket und Bereitstellung erstellen, sollten Sie Ihre Projekte in demselben Ausgabeordner erstellen und sicherstellen, dass Sie alle Referenzen haben, die Sie dort benötigen.
CopyLocal ist besonders beim Erstellen großer Quellbäume ein Problem. Es gab eine verwandte Frage zum Deaktivieren von CopyLocal hier auf SO. Sie können sie unter Wie überschreibe ich die Einstellung CopyLocal (privat) für Referenzen in .NET von MSBUILD sehen . Sowie Best Practices für große Lösungen in Visual Studio (2008).
Ich habe im Artikel MSBuild: Best Practices zum Erstellen zuverlässiger Builds, Teil 2, darüber geschrieben, wie mit dem Erstellen großer Quellbäume umgegangen werden soll .
Kurz gesagt würde ich sagen, deaktivieren Sie CopyLocal, wenn das Kopieren von Dateien dazu führt, dass Ihre Builds mehr Zeit in Anspruch nehmen, als Sie für jeden Build ausgeben möchten.
quelle
Es geht wirklich um die Zielumgebung. Wenn copy local falsch ist, sagen Sie, dass die Assembly bereits in der Zielumgebung (normalerweise im GAC) vorhanden ist. Wenn Sie den Wert auf "true" setzen, wird sichergestellt, dass er in der Ausgabe Ihres Builds angezeigt wird, sodass die Bereitstellung in der Zielumgebung einfacher wird.
quelle
Lesen Sie die folgende MSDN-Referenz, in der das Verhalten von CopyLocal ausführlich erläutert wird.
Projektreferenzen
Leider gibt es einige Macken, und CopyLocal muss nicht wie erwartet für Assemblyreferenzen in sekundären Assemblys funktionieren, die wie unten gezeigt strukturiert sind.
Dies macht xcopy-Bereitstellungen schwierig, wenn Sie nicht vorhaben, die Assembly eines Drittanbieters im GAC auf dem Zielcomputer zu installieren.
quelle
Diese Option wirkt sich nur auf die Erstellungsphase aus. Es wird nur der Verweis auf das lokale Verzeichnis der erstellten Assembly kopiert.
Wenn eine andere Assembly (T) eine Methode aus der Assembly verwenden möchte, die Sie erstellen (A), die einen Rückgabetyp oder Parameter von einer anderen Assembly (R) hat, auf die verwiesen wird, sollte sie (T) auf diese Assembly (R) zugreifen können. Möglicherweise ist dies ohne besondere Maßnahmen möglich, wenn die referenzierte Baugruppe (R) in GAC installiert ist. Andernfalls wird eine lokale Kopie davon benötigt.
quelle
Die konservative Möglichkeit, CopyLocal auf false zu setzen, besteht darin, zu überprüfen, ob die Referenz im Ausgabepfad des Projekts gefunden wird. Dies sollte es Ihnen ermöglichen, einigen unangenehmen Laufzeitproblemen auszuweichen und gleichzeitig die Menge an E / A zu reduzieren.
Dabei habe ich CopyLocalFixer erstellt , den Sie für einen Ordner ausführen können. Ich habe es mit einem großen Build versucht, aber die Ergebnisse waren ehrlich gesagt nicht so beeindruckend. Ich denke, es kommt auf die Ordnerstruktur des Projekts an.
quelle
Das Setzen von CopyLocal = false verbessert die Erstellungszeit, kann jedoch während der Bereitstellungszeit unterschiedliche Probleme verursachen.
Meine Erfahrung mit dem Setzen von CopyLocal = false war nicht erfolgreich. Siehe Zusammenfassung der Vor- und Nachteile in meinem Blog-Beitrag " Ändern Sie NICHT" Lokale Projektreferenzen kopieren auf "Falsch", es sei denn, Sie verstehen Teilfolgen . "
quelle