Ottieni TFS per ignorare la cartella dei miei pacchetti


332

Sto cercando di far sì che TFS (2013) ignori la mia packagescartella. Con passione non voglio che sia controllato dalla fonte mentre sto usando NuGet ed è fantastico!

Ho provato a mascherare (non sembra funzionare), ho provato ad aggiungere .tfignorefile - nulla viene ignorato. Perché il team TFS non aggiunge semplicemente un'opzione per ignorare permanentemente una cartella o un file come fanno molti dei client Subversion ?!


Quali versioni di TFS e Visual Studio stai usando? Stai utilizzando aree di lavoro locali o server?
James Reed,



1
Dovresti cambiare la risposta a questa domanda
Chris Marisic il

3
Se stai usando NuGet è necessaria la cartella dei pacchetti. Tuttavia, è possibile impostare NuGet per ripristinare i file binari mancanti durante la compilazione (in modo da controllare il codice sorgente della cartella dei pacchetti, ma ignorare i file binari). - Ma ci sono problemi: è possibile che un binario NuGet venga aggiornato (senza cambiare il numero di versione), o che venga rimosso, ecc. - È possibile che si verifichino stranezze di ogni genere. Non lasciare le tue build al caso - controlla nell'intera cartella dei pacchetti. Ti risparmierai un sacco di mal di testa.
BrainSlugs83

Risposte:


497

Ecco il problema: dobbiamo dire sia a NuGet che a TFS di ignorare i pacchetti, perché NuGet sta provando a fare cose relative al controllo del codice sorgente che assolutamente non dovrebbe fare (cattiva forma, Microsoft!). Quindi devi fare due cose.

Innanzitutto, aggiungi un file denominato .tfignorenella cartella della soluzione (nota la mancanza di sdopo il tf). Il suo contenuto dovrebbe essere il seguente:

\packages

Ciò dice a TFS di ignorare la cartella dei pacchetti. Ora lo faresti penseresti che questo ignorerebbe anche il repositories.configfile. Ma non lo farà. Perché? Chissà, i modi di Microsoft sono strani e misteriosi. In realtà, penso che faccia parte delle cose NuGet che espongo di seguito, ma se ciò verrà risolto in futuro e si desidera conservare il repositories.configfile invece di consentire a VS di rigenerarlo, si dovrebbe essere in grado di utilizzare questo:

\packages
!\packages\repositories.config

OK, quindi ora grazie al nostro .tfignorefile, TFS sta ignorando i tuoi pacchetti. Va tutto bene, vero? SBAGLIATO , perché NuGet si sta dando da fare con il controllo del codice sorgente e aggiungendo i pacchetti alle modifiche in sospeso. Quindi ora diciamo a NuGet di tagliarlo già.

Creare una cartella chiamata .nugetnella cartella principale della cartella della soluzione. 1 Ora, crea un file chiamato NuGet.confige inseriscilo in questa nuova cartella 2 . Il suo contenuto dovrebbe apparire così:

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

E ora i tuoi pacchetti dovrebbero rimanere fuori dal controllo del codice sorgente. Ricorda solo di aggiungere i file NuGet.confige .tfignoreal controllo del codice sorgente in modo da non perderli mai.

MODIFICA: In caso di problemi, è possibile che si desideri eliminare la cartella dei pacchetti, verificare quella modifica e quindi seguire i passaggi precedenti.

MODIFICA ANCHE: Sembra che questo non accadrà con le versioni più recenti di Nuget. Quindi forse se passi a VS / TFS 2017 questo problema si risolverà senza saltare attraverso i cerchi sopra.

1 . Aggiungi la cartella usando Explorer controllo sorgente; fare clic con il tasto destro del mouse sulla soluzione-> Aggiungi cartella ->. nuget
2 . Quando l'ho capito usando VS 2013, ho scoperto che NuGet.config doveva andare nella cartella .nuget. Anche se hai già un file NuGet.config nella radice della cartella della tua soluzione (perché, ad esempio, la tua azienda ha un feed nuget interno). Tuttavia, alcuni nei commenti hanno indicato che funziona bene nella radice della soluzione in VS 2015. Personalmente, sono passato all'utilizzo di TFS in modalità git, quindi non posso testare. Inoltre, se disponi di un feed personalizzato, assicurati di avere sia il feed personalizzato che nuget.org come chiavi nel file Nuget.config, oppure a volte TFS deciderà casualmente che non è possibile ripristinare i pacchetti.


1
Credo che questo richieda almeno TFS 2012. stackoverflow.com/questions/14365929/...
ClearCloud8

2
@zespri Quale file è in attesa di eliminazione? Il pacchetto NuGet? Questo non dovrebbe essere in attesa di cancellazione ... dovrebbe essere eliminato! Dopo aver fatto ciò che ho suggerito sopra, vai su Team Explorer ed elimina tutti i pacchetti Nuget che potrebbero essere già nel controllo del codice sorgente. Oppure elimina del tutto la cartella dei pacchetti. Sto lavorando con questa configurazione da mesi e non ho mai riscontrato questo errore.
Pharylon,

5
Cordiali saluti in VS2015, nuget.config non deve essere all'interno di /.nuget/. Funziona alla grande nella soluzione root.
jnm2,

141
Per chiunque si chieda come creare una cartella e un file che inizi con un punto, termina il nome con un altro punto. Quindi sarebbe .tfignore. e .nuget.
Derek Ziemba,

16
@DerekZiemba Neat trick! L'ho fatto attraverso la riga di comando in tutti questi anni. Penso che valga la pena ricordare che quando lo fai, il finale "." sarà rimosso, inizialmente pensavo che il tuo suggerimento fosse di vivere solo con un extra "." sulla fine.

53

Una soluzione alternativa a quanto sopra è la seguente.

  • Aggiungi la cartella dei pacchetti a TFS (senza file o sottocartelle)
  • Fare clic con il tasto destro sulla cartella Pacchetti
  • Pulsante sinistro del mouse Avanzato
  • Fai clic su Mantello

Vale la pena notare che questa soluzione dovrebbe essere applicata per area di lavoro TFS. Ha funzionato in modo molto più affidabile per me piuttosto che utilizzare il .tfignorefile.

Puoi leggere ulteriori informazioni su questo approccio nell'articolo del blog Impedire a TFS di aggiungere pacchetti NuGet installati al controllo del codice sorgente .


23

per le persone che segnalano che l'opzione .tfignore non funzionava con l'impostazione nuget.config potrebbe essere interessante - questi passaggi alla fine hanno funzionato per me:

  1. Elimina tutto nella cartella dei miei pacchetti
  2. Assicurarsi che TFS non abbia alcuna modifica attorno a quella cartella in sospeso
  3. Chiudi VS
  4. Riaprire VS e ricaricare la soluzione - utilizzando Nuget Restore per ripopolare i pacchetti Nota: non sono in corso modifiche per il controllo del codice sorgente TFS

3
Questo ha funzionato per me dopo aver applicato la soluzione di Pharylon, cosa che ho fatto dopo aver ripristinato i pacchetti.
user849924

1
Davvero utile, dobbiamo farlo per Initial Time (First Commit del file .tfignore sul TFS), ma non tutti. se ho ragione.
RajeshKdev,

Penso che questo approccio funzionerà solo sulla macchina che crea il mantello. Ho ragione io? quindi questo non risolve il problema alla radice di tutti i membri del team.
panox,

Una variazione di questo ha funzionato per me: mi sono assicurato che non fosse già stato eseguito il commit di nulla dai pacchetti, quindi ho eliminato la directory dei pacchetti dal disco. A questo punto, stava ancora mostrando come modifiche in sospeso nell'esploratore del team VS, quindi ho scelto di annullare le modifiche in sospeso nella directory dei pacchetti. Questo ha ripulito (senza che io abbia bisogno di chiudere / riaprire), e non torneranno =)
frax

8

Aggiungi un file nuget.config in una cartella .nuget nella tua soluzione. Aggiungi quanto segue al file nuget.config:

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

DisableSourceControlIntegration è ciò che rende il trucco per TFS Version Control.


Non ha alcun effetto, inoltre non è una soluzione globale.
Jaster,

@Quanti Goblin: hai provato questo su un progetto / sln completamente nuovo? (Solo per verificarlo) Sono curioso di sapere cosa nella tua installazione non funziona, perché funziona ogni volta che lo faccio da solo, ed è il modo consigliato di farlo con TFS / nuget. Inoltre, su quale versione di VS / TFS vedi questo?
Terje Sandstrøm,

Visual studio 2013. Nuova soluzione, aye. Ho risolto questo problema aggiungendo un .tfignore ignorando esplicitamente ogni pacchetto.
So Many Goblins,

2
Bene, questo è effettivamente ciò che fa "Abilita ripristino pacchetto NuGet". Assicurati di CHIUDERE e riaprire la tua soluzione! Il file NuGet.config viene letto solo all'apertura della soluzione.
Heliac,

Questo non ha funzionato abbastanza per me su Visual Studio online e VS2013. Ho usato la soluzione clic destro> Abilita ripristino pacchetto NuGet. Ciò aggiungerà il file Nuget.config alla radice della soluzione Aggiungi il .tfignore. Normalmente lo faccio aggiungendo un file di testo alla radice della soluzione, lasciandolo rilevare e quindi escludendo facendo clic su "rilevato Aggiungi"> clic con il tasto destro del mouse su Ignora. Quindi controlla tutto, compresi eventuali pacchetti Quindi elimina tutti i pacchetti nella tua soluzione e controlla questa modifica (questo rimuoverà i pacchetti da TFS) Apri la soluzione e costruisci che aggiungerà i pacchetti ma TFS non li raccoglierà.
David Wilton,

7

Per funzionare, devi utilizzare le aree di lavoro locali .tfignore. Il .tfignorefile deve trovarsi nella cartella che contiene i file o le cartelle che si desidera ignorare.

Quindi, se la struttura della soluzione è simile alla seguente:

\Project
   \Packages
   \OtherStuff
   foo.cs

Metti il ​​tuo file .tfignore in \ Project:

\Project
   \Packages
   \OtherStuff
   foo.cs
   .tfignore

Il contenuto di .tfignore nel tuo caso sarebbe:

\packages

Ecco alcuni documenti per te: http://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore


2
Ho aggiunto i file .tfignore e quando costruisco il progetto sta ancora cercando di aggiungere pacchetti a tfs. Sembra che poco possa fare per fermarlo.
Matt,

Puoi pubblicare il file ignore che hai aggiunto?
MrHinsh - Martin Hinshelwood,

2
Vedi docs.nuget.org/docs/reference/package-restore-with-team-build - è un bug NuGet con .tfignore, ma può essere corretto dicendo a NuGet di andare a spingere se stesso per l'integrazione di SCM.
user2864740

1
Sembra che il tuo esempio potrebbe essere sbagliato, pensa che dovrebbe essere packagesinvece che \packagescome relativo.
Martin,

6

Puoi impostarlo in modo permanente una sola volta nel tuo AppData\Roaming per tutte le soluzioni (vecchie e nuove)!

Nel tuo %AppData%\NuGet\NuGet.Configfile, aggiungi quanto segue appena prima del </configuration>tag XML ...

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

... puoi specificare qualsiasi percorso tu voglia - l'importante è metterlo FUORI dal tuo spazio di lavoro TFS!

Ora non devi più preoccuparti di quella roba. La cartella della soluzione non conterrà più alcun pacchetto; invece tutte le soluzioni utilizzano automaticamente la posizione dei pacchetti personalizzati.

NOTA: questo funziona su una base per utente.


1
Sembra buono e forse molto più semplice. Devi applicare questa configurazione a tutto il tuo team e in particolare al login / alla configurazione dei tuoi server di build anche se segui questo approccio?
Chris F Carroll,

Immagino di si. Non ho testato questo server di build WRT, mi dispiace. Immagino anche che percorsi di cartelle diverse verso le cartelle lib possano causare problemi (penso che alcuni pacchetti NuGet abbiano dei riferimenti concreti ai percorsi lib se ricordo bene).
Heliac,

2

Imposta la tua soluzione per il ripristino su build, la cartella del pacchetto e il file dei pacchetti verranno archiviati ma i pacchetti non lo faranno.


1
Spiega "ripristina su build".
user2864740

10
La funzionalità "Abilita ripristino pacchetto NuGet" del tasto destro del mouse di Visual Studio è obsoleta a partire da NuGet 2.7 - TFS 2013 supporta nativamente il ripristino dei pacchetti NuGet senza il file NuGet.targets e le modifiche ai file proj.
Daniel Mann,

1

Se stai usando Git con TFS devi aggiungere un file ".gitignore". Puoi farlo in "progetto di gruppo | Impostazioni | 'aggiungi ignora file'". Quindi aprire il file e decommentare l'istruzione ignore integrata per i pacchetti Nuget.

Se si utilizza TFVC e si dispone di aree di lavoro locali configurate, è possibile utilizzare il file ".tfignore" che rispetta un formato identico al file Git. Penso che tu abbia bisogno di "pacchetti /".


noi noi TFSVC e come già menzionato nel post iniziale - il file .tfignore non funziona.
Jaster,

Come ho affermato, è necessario utilizzare il formato corretto di .tfignore. Credo che tu abbia la barra
rovesciata nel

@MrHinsh dopo aver parlato con Ed Thompson, il file .tfignore non funziona correttamente. Il .gitignore invece lo fa.
DaveShaw,

@Ed deve risolvere questo problema;)
MrHinsh - Martin Hinshelwood,

1

Questo non ha funzionato abbastanza per me su Visual Studio online e VS2013.

  • Soluzione clic destro> Abilita ripristino pacchetto NuGet. Ciò aggiungerà il file Nuget.config alla soluzione

inserisci qui la descrizione dell'immagine

  • Aggiungi .tfignore. Normalmente lo faccio aggiungendo un file di testo alla radice della soluzione, lasciandolo rilevare e quindi escludendo facendo clic su "rilevato Aggiungi"> clic con il tasto destro del mouse su Ignora.

inserisci qui la descrizione dell'immagine

  • Aggiungi i pacchetti a .tfignore e digli di includere repositories.config

inserisci qui la descrizione dell'immagine

Dagli altri commenti sembra che il tuo chilometraggio possa variare a questo punto. Questo è ciò che faccio:

  • Controlla tutto, compresi eventuali pacchetti.

  • Elimina tutti i pacchetti nella soluzione e quindi controlla questa modifica (questo rimuoverà i pacchetti da TFS)

  • Apri la soluzione e costruisci che aggiungerà i pacchetti al progetto ma TFS non li raccoglierà.


2
Innanzitutto, Abilita il ripristino di Nuget è obsoleto e non presente in VS 2015, se segui questa strada in un secondo momento. Secondo: il controllo dei pacchetti e delle DLL li aggiungerà al controllo del codice sorgente, eliminandoli nella soluzione e controllando che NON li rimuoveranno da SC, solo dalla punta del ramo. -
Terje Sandstrøm,

1
@ TerjeSandstrøm punto preso, ma la domanda è specifica per il 2013. Sì, hai ragione, dovresti usare tf destro per rimuoverlo permanentemente dal controllo del codice sorgente, ma non ho trovato altro modo per far aderire TFS al file .tfignore
David Wilton,

1

La soluzione che ha funzionato per me è stata quella di creare sia un .tfignore che la seguente impostazione in Nuget.Config:

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

Il mio .tfignore contiene questa riga:

\packages

[Sto usando Visual Studio 2015 Update 2]

Questo non è l'ideale ed è attualmente registrato come problema aperto su github / nuget:

Semplifica l'omissione dei pacchetti da TFVC # 493


0

La risposta di Terje non funziona sempre per me, a volte funzionerà per un po ', ma poi farà ricadere un sacco di "aggiunte" per me.

L'unico modo in cui ho scoperto di risolverlo permanentemente è occultare la cartella dei pacchetti nel mio spazio di lavoro.

Per esempio:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages

È stato molto strano. Questo succede con le ultime versioni di Visual Studio e NuGet?
Terje Sandstrøm,

Sì, eseguo VS 2013.4 e NuGet 2.8 su aree di lavoro locali TFS 2012.
DaveShaw,

Devi mascherare OGNI cartella del pacchetto per dozzine di progetti e polutions. Inoltre, ogni membro del team deve ripetere la procedura per ogni area di lavoro
Jaster,

Cloak non è una buona risposta e le altre due risposte sopra funzionano e sono progettate. Ci deve essere qualcos'altro nel tuo ambiente.
MrHinsh - Martin Hinshelwood,

@MrHinsh - varie persone nel reparto hanno guardato questo ed è solo rotto. Sembra a posto con Git, ma quando si utilizza TFVC lo fa sempre.
DaveShaw,

0

Ho avuto lo stesso problema. /packagesdovrebbe funzionare ma non per me. packages*.*ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.