Lassen Sie TFS meinen Paketordner ignorieren

332

Ich versuche, TFS (2013) dazu zu bringen, meinen packagesOrdner zu ignorieren . Ich möchte leidenschaftlich nicht, dass es quellengesteuert wird, da ich NuGet verwende und es großartig ist!

Ich habe versucht zu tarnen (scheint nicht zu funktionieren), ich habe versucht, .tfignoreDateien hinzuzufügen - nichts wird ignoriert. Warum fügt das TFS-Team nicht einfach eine Option hinzu, um einen Ordner oder eine Datei dauerhaft zu ignorieren, wie es viele Subversion-Clients tun?!

Matt
quelle
Welche Versionen von TFS und Visual Studio verwenden Sie? Verwenden Sie lokale oder Server-Arbeitsbereiche?
James Reed
Es ist anscheinend ein NuGet-Fehler: docs.nuget.org/docs/reference/package-restore-with-team-build
user2864740
1
Sie sollten die Antwort auf diese Frage ändern
Chris Marisic
3
Wenn Sie NuGet verwenden, ist der Paketordner erforderlich. Sie können NuGet so einstellen, dass die fehlenden Binärdateien beim Erstellen wiederhergestellt werden (sodass Sie den Paketordner als Quellcodeverwaltung verwenden, die Binärdateien jedoch ignorieren). - Aber es gibt Probleme damit: Es ist möglich, dass eine NuGet-Binärdatei aktualisiert wird (ohne dass sich die Versionsnummer ändert) oder entfernt wird usw. - Es können alle möglichen seltsamen Kuriositäten auftreten. Überlassen Sie Ihre Builds nicht dem Zufall - checken Sie den gesamten Paketordner ein. Sie sparen sich viele Kopfschmerzen.
BrainSlugs83

Antworten:

497

Hier ist der Deal: Wir müssen sowohl NuGet als auch TFS anweisen, die Pakete zu ignorieren, da NuGet versucht, Dinge im Zusammenhang mit der Quellcodeverwaltung zu tun, die es absolut nicht tun sollte (schlechte Form, Microsoft!). Sie müssen also zwei Dinge tun.

Fügen Sie zunächst eine Datei mit dem Namen .tfignorezum Lösungsordner hinzu (beachten Sie das Fehlen von snach dem tf). Sein Inhalt sollte wie folgt sein:

\packages

Das weist TFS an, Ihren Paketordner zu ignorieren. Nun würden Sie denken, dass dies auch die repositories.configDatei ignorieren würde . Aber das wird es nicht. Warum? Wer weiß, die Wege von Microsoft sind seltsam und mysteriös. Eigentlich denke ich, dass es Teil des NuGet-Materials ist, das ich unten skizziere, aber wenn dies in Zukunft jemals behoben wird und Sie die repositories.configDatei behalten möchten, anstatt VS sie neu generieren zu lassen, sollten Sie in der Lage sein, Folgendes zu verwenden:

\packages
!\packages\repositories.config

OK, dank unserer .tfignoreDatei ignoriert TFS Ihre Pakete. Alles ist gut, oder? FALSCH , weil NuGet mit Ihrer Quellcodeverwaltung herumspielt und die Pakete zu Ihren ausstehenden Änderungen hinzufügt. Lassen Sie uns nun NuGet anweisen, es bereits auszuschneiden.

Erstellen Sie einen Ordner, der .nugetim Stammverzeichnis Ihres Lösungsordners aufgerufen wird . 1 Erstellen Sie nun eine Datei mit dem Namen NuGet.configund legen Sie sie in diesem neuen Ordner ab. 2 . Der Inhalt sollte folgendermaßen aussehen:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

Und jetzt sollten Ihre Pakete außerhalb der Quellcodeverwaltung bleiben. Denken Sie daran, die Dateien NuGet.configund .tfignorezur Quellcodeverwaltung hinzuzufügen, damit sie nie verloren gehen.

BEARBEITEN: Wenn Sie Probleme haben, möchten Sie möglicherweise Ihren Paketordner löschen, diese Änderung einchecken und dann die obigen Schritte ausführen.

AUCH BEARBEITEN: Es sieht so aus, als würde dies mit neueren Versionen von Nuget nicht passieren. Wenn Sie also zu VS / TFS 2017 wechseln, wird dieses Problem möglicherweise behoben, ohne durch die oben genannten Rahmen zu springen.

1 . Fügen Sie den Ordner mit dem Quellcodeverwaltungs-Explorer hinzu. Klicken Sie mit der rechten Maustaste auf die Lösung-> Ordner hinzufügen ->. Nuget
2 . Als ich dies mit VS 2013 herausfand, stellte ich fest, dass die Datei NuGet.config im Ordner .nuget abgelegt werden musste. Auch wenn Sie bereits eine NuGet.config-Datei im Stammverzeichnis Ihres Lösungsordners haben (weil Ihr Unternehmen beispielsweise über einen internen Nuget-Feed verfügt). Einige Kommentare haben jedoch darauf hingewiesen, dass es im Lösungsstamm in VS 2015 einwandfrei funktioniert. Persönlich habe ich im Git-Modus auf TFS umgestellt, sodass ich nicht testen kann. Wenn Sie über einen benutzerdefinierten Feed verfügen, stellen Sie außerdem sicher, dass Sie sowohl den benutzerdefinierten Feed als auch nuget.org als Schlüssel in der Datei Nuget.config haben. Andernfalls entscheidet TFS nach dem Zufallsprinzip, dass die Pakete nicht wiederhergestellt werden können.

Pharylon
quelle
1
Ich glaube, dies erfordert mindestens TFS 2012. stackoverflow.com/questions/14365929/…
ClearCloud8
2
@zespri Welche Datei wartet auf einen Löschvorgang? Das NuGet-Paket? Das sollte nicht bis zum Löschen anstehen ... es sollte gelöscht werden! Nachdem Sie die oben vorgeschlagenen Schritte ausgeführt haben, rufen Sie den Team Explorer auf und löschen Sie alle Nuget-Pakete, die sich möglicherweise bereits in der Quellcodeverwaltung befinden. Oder löschen Sie einfach den Paketordner ganz. Ich habe monatelang mit diesem Setup gearbeitet und diesen Fehler nie erlebt.
Pharylon
5
Zu Ihrer Information in VS2015 muss sich nuget.config nicht in /.nuget/ befinden. Es funktioniert gut in der Lösungswurzel.
jnm2
141
Wenn Sie sich fragen, wie Sie einen Ordner und eine Datei erstellen sollen, die mit einem Punkt beginnen, beenden Sie den Namen mit einem anderen Punkt. Das wäre also .tfignore. und .nuget.
Derek Ziemba
16
@DerekZiemba Ordentlicher Trick! Ich habe es all die Jahre über die Kommandozeile gemacht. Ich denke, es ist erwähnenswert, dass, wenn Sie das tun, das nachfolgende '.' wird entfernt, ich dachte zunächst, Ihr Vorschlag wäre, nur mit einem zusätzlichen 'zu leben.' am Ende.
53

Eine alternative Lösung zu den oben genannten ist die folgende.

  • Fügen Sie den Paketordner zu TFS hinzu (ohne Dateien oder Unterordner).
  • Klicken Sie mit der rechten Maustaste auf den Paketordner
  • Klicken Sie mit der linken Maustaste auf Erweitert
  • Klicken Sie auf Umhang

Es ist erwähnenswert, dass diese Lösung pro TFS-Arbeitsbereich angewendet werden muss. Es hat für mich viel zuverlässiger funktioniert, als die .tfignoreDatei zu verwenden.

Weitere Informationen zu diesem Ansatz finden Sie im Blog-Artikel Verhindern, dass TFS installierte NuGet-Pakete zur Quellcodeverwaltung hinzufügt .

Ryan Gates
quelle
23

Für Leute, die berichten, dass die Option .tfignore nicht mit der Einstellung nuget.config funktioniert, könnte dies von Interesse sein - diese Schritte haben schließlich für mich funktioniert:

  1. Löschen Sie alles in meinem Paketordner
  2. Stellen Sie sicher, dass in TFS keine Änderungen an diesem Ordner anstehen
  3. Schließen Sie VS
  4. Öffnen Sie VS erneut und laden Sie die Lösung neu. Verwenden Sie die Nuget-Wiederherstellung, um Pakete erneut zu füllen. Beachten Sie, dass für die TFS-Quellcodeverwaltung keine Änderungen anstehen
Adam Stewart
quelle
3
Dies funktionierte für mich nach der Anwendung der Pharylon-Lösung, die ich nach dem Wiederherstellen von Paketen durchgeführt habe.
user849924
1
Wirklich hilfreich, wir müssen dies für die Anfangszeit tun (Erstes Festschreiben der .tfignore-Datei an das TFS), aber nicht für jeden. wenn ich richtig bin
RajeshKdev
Ich denke, dieser Ansatz funktioniert nur auf der Maschine, aus der der Umhang besteht. Ich habe Recht? Dies löst also nicht das Grundproblem für alle Teammitglieder.
Panox
Eine Variation davon funktionierte für mich - ich stellte sicher, dass bereits nichts von Paketen festgeschrieben wurde, und löschte dann das Paketverzeichnis von der Festplatte. Zu diesem Zeitpunkt wurden im VS-Team-Explorer noch Änderungen als ausstehende Änderungen angezeigt. Daher habe ich beschlossen, die im Paketverzeichnis ausstehenden Änderungen rückgängig zu machen. Dies hat es aufgeräumt (ohne dass ich schließen / wieder öffnen muss), und sie kommen nicht zurück =)
frax
8

Fügen Sie eine nuget.config-Datei in einem .nuget-Ordner in Ihrer Lösung hinzu. Fügen Sie der Datei nuget.config Folgendes hinzu:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

Die disableSourceControlIntegration macht den Trick für die TFS-Versionskontrolle aus.

Terje Sandstrøm
quelle
Hat keine Wirkung - auch überhaupt keine globale Lösung.
Jaster
@ So viele Goblins: Hast du das bei einem völlig neuen Projekt / SLN versucht? (Nur zum Auschecken) Ich bin gespannt, was in Ihrem Setup dazu führt, dass dies nicht funktioniert, da es jedes Mal funktioniert, wenn ich es selbst mache, und es ist die empfohlene Methode, dies mit TFS / nuget zu tun. Auf welcher VS / TFS-Version sehen Sie das?
Terje Sandstrøm
Visual Studio 2013. Neue Lösung, ja. Ich habe dieses Problem umgangen und einen .tfignore hinzugefügt, der jedes Paket explizit ignoriert.
So viele Goblins
2
Okay, genau das macht "NuGet Package Restore aktivieren". Schließen Sie einfach Ihre Lösung und öffnen Sie sie erneut! Die Datei NuGet.config wird erst beim Öffnen Ihrer Lösung gelesen.
Heliac
Bei Visual Studio Online und VS2013 hat das bei mir nicht ganz funktioniert. Ich habe Rechtsklick-Lösung> NuGet-Paketwiederherstellung aktivieren verwendet. Dadurch wird die Datei Nuget.config zum Lösungsstamm hinzugefügt. Fügen Sie den .tfignore hinzu. Normalerweise füge ich dazu eine Textdatei zum Lösungsstamm hinzu, lasse sie dies erkennen und schließe sie dann aus, indem ich auf "Erkanntes Hinzufügen" klicke> Rechtsklick auf "Ignorieren". Checken Sie dann alles ein, einschließlich aller Pakete. Löschen Sie dann alle Pakete in Ihrer Lösung und checken Sie diese Änderung ein (dadurch werden die Pakete aus TFS entfernt). Öffnen Sie die Lösung und erstellen Sie sie, wodurch die Pakete hinzugefügt werden, TFS sie jedoch nicht abholt.
David Wilton
7

Sie müssen lokale Arbeitsbereiche verwenden, um .tfignorearbeiten zu können. Die .tfignoreDatei muss sich in dem Ordner befinden, der die Dateien oder Ordner enthält, die Sie ignorieren möchten.

Wenn Ihre Lösungsstruktur also so aussieht:

\Project
   \Packages
   \OtherStuff
   foo.cs

Sie haben Ihre .tfignore-Datei in \ Project abgelegt:

\Project
   \Packages
   \OtherStuff
   foo.cs
   .tfignore

Der Inhalt des .tfignore in Ihrem Fall wäre:

\packages

Hier ist eine Dokumentation für Sie: http://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore

Daniel Mann
quelle
2
Ich habe die .tfignore-Dateien hinzugefügt und beim Erstellen des Projekts wird immer noch versucht, Pakete zu tfs hinzuzufügen. Es scheint wenig, was ich tun kann, um es zu stoppen.
Matt
Können Sie die von Ihnen hinzugefügte Ignorierdatei veröffentlichen?
MrHinsh - Martin Hinshelwood
2
Siehe docs.nuget.org/docs/reference/package-restore-with-team-build - es handelt sich um einen NuGet-Fehler mit .tfignore, der jedoch behoben werden kann, indem NuGet angewiesen wird, sich für die SCM-Integration selbst zu schieben.
user2864740
1
Es sieht aus wie du bist Beispiel falsch sein könnte, es denken sollte es sein , packagesstatt \packageswie es ist relativ.
Martin
6

Sie können dies einmalig in Ihrem AppData\Roamingfür alle Lösungen (alt & neu) einstellen !

Fügen Sie in Ihrer %AppData%\NuGet\NuGet.ConfigDatei Folgendes unmittelbar vor dem </configuration>XML-Tag hinzu ...

<config>
  <add key="repositoryPath" value="C:\NuGetPackages" />
</config>
<solution>
  <add key="disableSourceControlIntegration" value="true" />
</solution>

... Sie können einen beliebigen Pfad angeben - das Wichtigste ist, ihn AUSSERHALB Ihres TFS-Arbeitsbereichs zu platzieren!

Jetzt müssen Sie sich nie wieder um dieses Zeug kümmern. Ihr Lösungsordner enthält keine Pakete mehr. Alle Lösungen verwenden stattdessen standardmäßig den Speicherort Ihrer benutzerdefinierten Pakete.

HINWEIS - Dies funktioniert auf Benutzerbasis.

Heliac
quelle
1
Klingt gut und möglicherweise viel einfacher. Sie müssen dieses Setup in Ihrem Team durchsetzen, insbesondere auch die Anmeldung / Einrichtung Ihrer Build-Server, wenn Sie diesen Ansatz wählen?
Chris F Carroll
Das würde ich mir vorstellen. Ich habe diese WRT-Build-Server leider nicht getestet. Ich würde mir auch vorstellen, dass unterschiedliche Ordnerpfade zu den lib-Ordnern Probleme verursachen könnten (ich denke, einige NuGet-Pakete haben harte Verweise auf die lib-Pfade, wenn ich mich richtig erinnere).
Heliac
2

Stellen Sie Ihre Lösung so ein, dass sie beim Erstellen wiederhergestellt wird. Der Paketordner und die Paketdatei werden eingecheckt, die Pakete jedoch nicht.

Nur TFS
quelle
1
Bitte erläutern Sie "Beim Erstellen wiederherstellen".
user2864740
10
Die Visual Studio-Rechtsklickfunktion "NuGet-Paketwiederherstellung aktivieren" ist ab NuGet 2.7 veraltet. TFS 2013 unterstützt nativ das Wiederherstellen von NuGet-Paketen ohne die Datei NuGet.targets und Änderungen an den Projektdateien.
Daniel Mann
1

Wenn Sie Git mit TFS verwenden, müssen Sie eine ".gitignore" -Datei hinzufügen. Sie können dies unter "Teamprojekt | Einstellungen | 'Ignorierdatei hinzufügen'" tun. Öffnen Sie dann die Datei und kommentieren Sie die integrierte Ignorieranweisung für Nuget-Pakete aus.

Wenn Sie TFVC verwenden und lokale Arbeitsbereiche konfiguriert haben, können Sie die Datei ".tfignore" verwenden, die ein identisches Format wie die Git-Datei aufweist. Ich denke du brauchst "Pakete /".

MrHinsh - Martin Hinshelwood
quelle
wir uns TFSVC und wie bereits im ersten Beitrag erwähnt - die .tfignore-Datei funktioniert nicht.
Jaster
Wie bereits erwähnt, müssen Sie das richtige Format von .tfignore verwenden. Ich glaube , Sie haben das in die falsche Richtung Slash Runde
MrHinsh - Martin Hinshelwood
@ MrHinsh Nach einem Gespräch mit Ed Thompson funktioniert die .tfignore-Datei nicht richtig. Der .gitignore tut dies jedoch.
DaveShaw
@ Ed muss das beheben;)
MrHinsh - Martin Hinshelwood
1

Bei Visual Studio Online und VS2013 hat das bei mir nicht ganz funktioniert.

  • Klicken Sie mit der rechten Maustaste auf Lösung> NuGet-Paketwiederherstellung aktivieren. Dadurch wird die Datei Nuget.config zur Lösung hinzugefügt

Geben Sie hier die Bildbeschreibung ein

  • Fügen Sie den .tfignore hinzu. Normalerweise füge ich dazu eine Textdatei zum Lösungsstamm hinzu, lasse sie dies erkennen und schließe sie dann aus, indem ich auf "Erkanntes Hinzufügen" klicke> Rechtsklick auf "Ignorieren".

Geben Sie hier die Bildbeschreibung ein

  • Fügen Sie die Pakete zu .tfignore hinzu und weisen Sie sie an, repositories.config einzuschließen

Geben Sie hier die Bildbeschreibung ein

Aus den anderen Kommentaren geht hervor, dass Ihr Kilometerstand an dieser Stelle variieren kann. Das ist was ich mache:

  • Checken Sie alles ein, einschließlich aller Pakete.

  • Löschen Sie alle Pakete in Ihrer Lösung und checken Sie diese Änderung ein (dadurch werden die Pakete aus TFS entfernt).

  • Öffnen Sie die Lösung und erstellen Sie sie, um die Pakete zum Projekt hinzuzufügen, aber TFS holt sie nicht ab.

David Wilton
quelle
2
Erstens ist die Aktivierung der Nuget-Wiederherstellung deaktiviert und in VS 2015 nicht vorhanden, wenn Sie diesen Weg später gehen. Zweitens: Durch das Einchecken von Paketen und DLLs werden diese zur Quellcodeverwaltung hinzugefügt, durch Löschen in der Lösung und durch Einchecken werden sie NICHT aus SC entfernt, sondern nur von der Spitze Ihres Zweigs. -
Terje Sandstrøm
1
@ TerjeSandstrøm Punkt genommen, aber die Frage ist spezifisch für 2013. Ja, Sie haben Recht, Sie müssten tf destroy verwenden, um es dauerhaft aus der Quellcodeverwaltung zu entfernen, aber ich habe keine andere Möglichkeit gefunden, TFS dazu zu bringen, sich an die .tfignore-Datei zu halten
David Wilton
1

Die Lösung, die für mich funktioniert hat, bestand darin, sowohl einen .tfignore als auch die folgende Einstellung in der Nuget.Config zu erstellen:

<configuration>
  ...
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>  
  ...
</configuration>

Mein .tfignore enthält diese Zeile:

\packages

[Ich verwende Visual Studio 2015 Update 2]

Dies ist nicht ideal und wird derzeit als offenes Problem auf github / nuget protokolliert:

Erleichtern Sie das Weglassen von Paketen aus TFVC # 493

Redcalx
quelle
0

Terjes Antwort funktioniert nicht immer für mich, manchmal funktioniert es für eine Weile, aber dann hängt eine Menge "Adds" für mich wieder ab.

Die einzige Möglichkeit, dies dauerhaft zu lösen, besteht darin, den Paketordner in meinem Arbeitsbereich zu verschleiern.

Zum Beispiel:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages
DaveShaw
quelle
Das war sehr komisch. Geschieht dies mit den neuesten Visual Studio- und NuGet-Versionen?
Terje Sandstrøm
Ja, ich führe VS 2013.4 und NuGet 2.8 in lokalen TFS 2012-Arbeitsbereichen aus.
DaveShaw
Sie müssen JEDEN Paketordner für Dutzende von Projekten und Verschmutzungen tarnen. Außerdem muss jedes Mitglied des Teams den Vorgang für jeden Arbeitsbereich wiederholen
Jaster
Umhang ist keine gute Antwort und die beiden anderen Antworten oben funktionieren und sind beabsichtigt. In Ihrer Umgebung muss noch etwas los sein.
MrHinsh - Martin Hinshelwood
@ MrHinsh - verschiedene Leute in der Abteilung haben sich das angeschaut und es ist einfach kaputt. Es scheint mit Git in Ordnung zu sein, aber wenn TFVC verwendet wird, geschieht dies die ganze Zeit.
DaveShaw
0

Ich hatte das gleiche Problem. /packagessollte funktionieren, aber nicht für mich. packages*.*funktionierte.

Codierung4fun
quelle