Obtenir TFS pour ignorer mon dossier de packages

332

J'essaie d'obtenir que TFS (2013) ignore mon packagesdossier. Je ne veux pas passionnément qu'il soit contrôlé par la source car j'utilise NuGet et c'est génial!

J'ai essayé le camouflage (ne semble pas fonctionner), j'ai essayé d'ajouter des .tfignorefichiers - rien n'est ignoré. Pourquoi l'équipe TFS n'ajoute-t-elle pas simplement une option pour ignorer définitivement un dossier ou un fichier comme le font de nombreux clients Subversion?!

Mat
la source
Quelles versions de TFS et Visual studio utilisez-vous? Utilisez-vous des espaces de travail locaux ou serveur?
James Reed
Il s'agit apparemment d'un bogue NuGet: docs.nuget.org/docs/reference/package-restore-with-team-build
user2864740
1
Vous devriez changer la réponse à cette question
Chris Marisic
3
Si vous utilisez NuGet, le dossier des packages est requis. Vous pouvez cependant configurer NuGet pour restaurer les fichiers binaires manquants lors de la génération (afin que vous contrôliez à la source le dossier des packages, mais que vous ignoriez les fichiers binaires). - Mais il y a des problèmes avec cela: il est possible qu'un binaire NuGet soit mis à jour (sans que le numéro de version change), ou supprimé, etc. - Il est possible que toutes sortes de bizarreries étranges se produisent. Ne laissez pas vos builds au hasard - archivez le dossier des packages dans son intégralité. Vous vous épargnerez beaucoup de maux de tête.
BrainSlugs83

Réponses:

497

Voici l'affaire: nous devons dire à NuGet et TFS d'ignorer les packages, car NuGet essaie de faire des choses liées au contrôle de source qu'il ne devrait absolument pas faire (mauvaise forme, Microsoft!). Vous devez donc faire deux choses.

Tout d'abord, ajoutez un fichier nommé .tfignoredans le dossier de la solution (notez l'absence saprès le tf). Son contenu devrait être le suivant:

\packages

Cela indique à TFS d'ignorer votre dossier de packages. Maintenant, vous penseriez que cela ignorerait également le repositories.configfichier. Mais ce ne sera pas le cas. Pourquoi? Qui sait, les voies de Microsoft sont étranges et mystérieuses. En fait, je pense que cela fait partie des trucs NuGet que je décris ci-dessous, mais si cela se résout à l'avenir et que vous souhaitez conserver le repositories.configfichier au lieu de laisser VS le régénérer, vous devriez pouvoir utiliser ceci:

\packages
!\packages\repositories.config

OK, maintenant grâce à notre .tfignorefichier, TFS ignore vos packages. Tout va bien, non? FAUX , car NuGet contourne votre contrôle de source et ajoute les packages à vos modifications en attente. Alors maintenant, disons à NuGet de le couper déjà.

Créez un dossier appelé .nugetà la racine de votre dossier de solution. 1 Maintenant, créez un fichier appelé NuGet.configet placez-le dans ce nouveau dossier 2 . Son contenu devrait ressembler à ceci:

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

Et maintenant, vos packages doivent rester hors du contrôle des sources. N'oubliez pas d'ajouter les fichiers NuGet.configet .tfignoreau contrôle de code source afin qu'ils ne se perdent jamais.

EDIT: Si vous rencontrez des problèmes, vous souhaiterez peut-être supprimer votre dossier de packages, archivez cette modification, puis suivez les étapes ci-dessus.

ÉGALEMENT ÉDITER: Il semble que cela ne se produira pas avec les nouvelles versions de Nuget. Donc, peut-être que si vous passez à VS / TFS 2017, ce problème disparaîtra sans sauter à travers les cercles ci-dessus.

1 . Ajoutez le dossier à l'aide de l'Explorateur de contrôle de source; cliquez avec le bouton droit sur la solution-> Ajouter un dossier ->. nuget
2 . Lorsque j'ai compris cela à l'aide de VS 2013, j'ai trouvé que NuGet.config devait aller dans le dossier .nuget. Même si vous avez déjà un fichier NuGet.config à la racine de votre dossier de solution (car, disons, votre entreprise dispose d'un flux de pépites interne). Cependant, certains dans les commentaires ont indiqué que cela fonctionne bien dans la racine de la solution dans VS 2015. Personnellement, je suis passé à l'utilisation de TFS en mode git, donc je ne peux pas tester. En outre, si vous disposez d'un flux personnalisé, assurez-vous que vous disposez à la fois du flux personnalisé et de nuget.org en tant que clés dans le fichier Nuget.config, ou parfois TFS décidera au hasard qu'il ne peut pas restaurer les packages.

Pharylon
la source
1
Je crois que cela nécessite au moins TFS 2012. stackoverflow.com/questions/14365929/…
ClearCloud8
2
@zespri Quel fichier est en attente de suppression? Le package NuGet? Cela ne devrait pas être en attente de suppression ... il devrait être supprimé! Après avoir fait ce que j'ai suggéré ci-dessus, accédez à Team Explorer et supprimez tous les packages Nuget qui pourraient déjà être sous contrôle de code source. Ou supprimez simplement le dossier des packages. Je roule avec cette configuration depuis des mois et je n'ai jamais rencontré cette erreur.
Pharylon
5
Pour info dans VS2015, nuget.config n'a pas besoin d'être dans /.nuget/. Cela fonctionne très bien dans la racine de la solution.
jnm2
141
Si vous vous demandez comment créer un dossier et un fichier commençant par un point, terminez le nom par un autre point. Ce serait donc .tfignore. et .nuget.
Derek Ziemba
16
@DerekZiemba Truc sympa! Je l'ai fait via la ligne de commande toutes ces années. Je pense que cela vaut la peine de mentionner que lorsque vous faites cela, la fin "." sera supprimé, j'ai d'abord pensé que votre suggestion était de simplement vivre avec un supplément "." a la fin.
53

Une solution alternative à ce qui précède est la suivante.

  • Ajoutez le dossier des packages à TFS (sans aucun fichier ni sous-dossier)
  • Cliquez avec le bouton droit sur le dossier Packages
  • Clic gauche avancé
  • Cliquez sur Cape

Il convient de noter que cette solution devrait être appliquée par espace de travail TFS. Cela a fonctionné de manière beaucoup plus fiable pour moi plutôt que d'utiliser le .tfignorefichier.

Vous pouvez en savoir plus sur cette approche dans l'article de blog Empêcher TFS d'ajouter des packages NuGet installés au contrôle de code source .

Ryan Gates
la source
23

pour les personnes signalant que l'option .tfignore ne fonctionnait pas avec le paramètre nuget.config, cela pourrait être intéressant - ces étapes ont finalement fonctionné pour moi:

  1. Supprimer tout dans mon dossier de packages
  2. Assurez-vous que TFS n'a aucune modification autour de ce dossier en attente
  3. Fermer VS
  4. Rouvrez VS et solution de rechargement - à l'aide de la restauration Nuget pour re-remplir les packages Notez qu'aucune modification n'est en attente pour le contrôle de source TFS
Adam Stewart
la source
3
Cela a fonctionné pour moi après avoir appliqué la solution de Pharylon, ce que j'ai fait après la restauration des packages.
user849924
1
Vraiment utile, nous devons le faire pour l'heure initiale (première validation du fichier .tfignore sur le TFS), mais pas pour tout le monde. si j'ai raison.
RajeshKdev
Je pense que cette approche ne fonctionnera que sur la machine qui fabrique la cape. J'ai raison? donc cela ne résout pas le problème racine pour tous les membres de l'équipe.
panox
Une variante de cela a fonctionné pour moi - je me suis assuré que rien des packages n'avait déjà été validé, puis j'ai supprimé le répertoire des packages du disque. À ce stade, il était toujours affiché en tant que modifications en attente dans l'explorateur de l'équipe VS, j'ai donc choisi d'annuler les modifications en attente dans le répertoire des packages. Cela a nettoyé (sans que je doive fermer / rouvrir), et ils ne reviennent pas =)
frax
8

Ajoutez un fichier nuget.config dans un dossier .nuget de votre solution. Ajoutez ce qui suit au fichier nuget.config:

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

Le disableSourceControlIntegration est ce qui rend l'astuce pour le contrôle de version TFS.

Terje Sandstrøm
la source
N'a aucun effet - pas non plus du tout une solution globale.
Jaster
@So Many Goblins: Avez-vous essayé cela sur un tout nouveau projet / sln? (Juste pour le vérifier) ​​Je suis curieux de savoir ce qui, dans votre configuration, ne fonctionne pas, car cela fonctionne chaque fois que je le fais moi-même, et c'est la façon recommandée de le faire avec TFS / nuget. De plus, sur quelle version de VS / TFS voyez-vous cela?
Terje Sandstrøm
Visual studio 2013. Nouvelle solution, oui. J'ai contourné ce problème en ajoutant un .tfignore en ignorant explicitement chaque package.
So Many Goblins
2
D'accord, c'est effectivement ce que fait "Activer la restauration du package NuGet". N'oubliez pas de FERMER et de rouvrir votre solution! Le fichier NuGet.config n'est lu qu'à l'ouverture de votre solution.
Heliac
Cela n'a pas fonctionné pour moi sur Visual Studio Online et VS2013. J'ai utilisé la solution de clic droit> Activer la restauration du package NuGet. Cela ajoutera le fichier Nuget.config à la racine de la solution Ajoutez le .tfignore. Je le fais normalement en ajoutant un fichier texte à la racine de la solution, en le laissant détecter cela, puis en l'excluant en cliquant sur «ajout détecté»> clic droit ignorer. Ensuite, archivez tout, y compris les packages Ensuite, supprimez tous les packages de votre solution et archivez cette modification (cela supprimera les packages de TFS) Ouvrez la solution et construisez qui ajoutera les packages mais TFS ne les récupérera pas.
David Wilton
7

Vous devez utiliser des espaces de travail locaux pour .tfignoretravailler. Le .tfignorefichier doit se trouver dans le dossier qui contient les fichiers ou dossiers que vous souhaitez ignorer.

Donc, si la structure de votre solution ressemble à ceci:

\Project
   \Packages
   \OtherStuff
   foo.cs

Vous mettriez votre fichier .tfignore dans \ Project:

\Project
   \Packages
   \OtherStuff
   foo.cs
   .tfignore

Le contenu du .tfignore dans votre cas serait:

\packages

Voici une documentation pour vous: http://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore

Daniel Mann
la source
2
J'ai ajouté les fichiers .tfignore et lorsque je crée le projet, il essaie toujours d'ajouter des packages à tfs. Il semble que je ne puisse rien faire pour l'arrêter.
Matt
Pouvez-vous publier le fichier ignoré que vous avez ajouté?
MrHinsh - Martin Hinshelwood
2
Voir docs.nuget.org/docs/reference/package-restore-with-team-build - c'est un bogue NuGet avec .tfignore, mais peut être corrigé en disant à NuGet d'aller se pousser pour l'intégration SCM.
user2864740
1
Il semble que votre exemple soit faux, il pense que cela devrait être packagesplutôt \packagesque comme c'est relatif.
Martin
6

Vous pouvez définir cela de façon permanente dans vos AppData\Roamingsolutions pour toutes les anciennes (nouvelles et anciennes)!

Dans votre %AppData%\NuGet\NuGet.Configfichier, ajoutez ce qui suit juste avant la </configuration>balise XML ...

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

... vous pouvez spécifier n'importe quel chemin d'accès - l'important est de le placer EN DEHORS de votre espace de travail TFS!

Maintenant, vous n'avez plus à vous soucier de ce genre de choses. Votre dossier de solution ne contiendra plus de packages; toutes les solutions utiliseront par défaut l'emplacement de vos packages personnalisés à la place.

REMARQUE - Cela fonctionne est sur une base par utilisateur.

Héliaque
la source
1
Sonne bien et peut-être beaucoup plus simple. Vous devez appliquer cette configuration à l'ensemble de votre équipe, et en particulier à la connexion / configuration de vos serveurs de build si vous adoptez cette approche?
Chris F Carroll
J'imagine bien. Je n'ai pas testé ce serveur de construction WRT, désolé. J'imagine également que différents chemins de dossier vers les dossiers lib pourraient causer des problèmes (je pense que certains packages NuGet ont des références matérielles aux chemins lib si je me souviens bien).
Heliac
2

Définissez votre solution pour restaurer lors de la construction, le dossier et le fichier des packages seront archivés mais pas les packages.

Juste TFS
la source
1
Veuillez expliquer "restaurer sur build".
user2864740
10
La fonctionnalité de clic droit "Activer la restauration des packages NuGet" de Visual Studio est obsolète à partir de NuGet 2.7 - TFS 2013 prend en charge nativement la restauration des packages NuGet sans le fichier NuGet.targets et les modifications des fichiers proj.
Daniel Mann
1

Si vous utilisez Git avec TFS, vous devez ajouter un fichier ".gitignore". Vous pouvez le faire dans "projet d'équipe | Paramètres | 'ajouter ignorer le fichier'". Ensuite, ouvrez le fichier et décommentez l'instruction ignore intégrée pour les packages Nuget.

Si vous utilisez TFVC et que vous avez configuré des espaces de travail locaux, vous pouvez utiliser le fichier ".tfignore" qui respecte un format identique au fichier Git. Je pense que vous avez besoin de "packages /".

MrHinsh - Martin Hinshelwood
la source
nous nous TFSVC et comme déjà mentionné dans le post initial - le fichier .tfignore ne fonctionne pas.
Jaster
Comme je l'ai dit, vous devez utiliser le format correct de .tfignore. Je crois que vous avez la barre oblique dans le mauvais sens
MrHinsh - Martin Hinshelwood
@MrHinsh après avoir parlé à Ed Thompson, le fichier .tfignore ne fonctionne pas correctement. Le .gitignore le fait cependant.
DaveShaw
@Ed doit aller corriger ça;)
MrHinsh - Martin Hinshelwood
1

Cela n'a pas fonctionné pour moi sur Visual Studio Online et VS2013.

  • Cliquez avec le bouton droit sur Solution> Activer la restauration du package NuGet. Cela ajoutera le fichier Nuget.config à la solution

entrez la description de l'image ici

  • Ajoutez le .tfignore. Je le fais normalement en ajoutant un fichier texte à la racine de la solution, en le laissant détecter cela, puis en l'excluant en cliquant sur «ajout détecté»> clic droit ignorer.

entrez la description de l'image ici

  • Ajoutez les packages à .tfignore et dites-lui d'inclure repositories.config

entrez la description de l'image ici

D'après les autres commentaires, il semble que votre kilométrage puisse varier à ce stade. C'est ce que je fais:

  • Vérifiez tout, y compris tous les colis.

  • Supprimez tous les packages de votre solution, puis archivez cette modification (cela supprimera les packages de TFS)

  • Ouvrez la solution et construisez qui ajoutera les packages au projet mais TFS ne les récupérera pas.

David Wilton
la source
2
Tout d'abord, l'option Activer la restauration Nuget est obsolète et n'est pas présente dans VS 2015, si vous suivez cette voie plus tard. Deuxièmement: l'archivage des packages et des DLL les ajoutera au contrôle de code source, les supprimera dans la solution et les archivera ne les supprimera PAS du SC, juste de la pointe de votre branche. -
Terje Sandstrøm
1
@ Point TerjeSandstrøm pris, mais la question est spécifique à 2013. Oui, vous avez raison, vous devez utiliser tf destroy pour le supprimer définitivement du contrôle de code source, mais je n'ai trouvé aucun autre moyen pour que TFS adhère au fichier .tfignore
David Wilton
1

La solution qui a fonctionné pour moi a été de créer à la fois un fichier .tfignore et le paramètre suivant dans Nuget.Config:

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

Mon .tfignore contient cette ligne:

\packages

[J'utilise Visual Studio 2015 Update 2]

Ce n'est pas idéal et est actuellement enregistré comme un problème ouvert sur github / nuget:

Facilitez l'omission de packages dans TFVC # 493

redcalx
la source
0

La réponse de Terje ne fonctionne pas tout le temps pour moi, parfois cela fonctionnera pendant un certain temps, mais alors cela suspendra une charge d '"ajouts" pour moi encore une fois.

Le seul moyen que j'ai trouvé pour résoudre ce problème de manière permanente est de masquer le dossier des packages dans mon espace de travail.

Par exemple:

Type      Server                Local
============================================
Active    $/Work/Main           C:\Code\Main
Cloaked   $/Work/Main/Packages
DaveShaw
la source
C'était très bizarre. Cela se produit-il avec les dernières versions de Visual Studio et NuGet?
Terje Sandstrøm
Oui, j'exécute VS 2013.4 et NuGet 2.8 sur les espaces de travail locaux TFS 2012.
DaveShaw
Vous devez masquer CHAQUE dossier de package pour des dizaines de projets et de polutions. De plus, chaque membre de l'équipe doit répéter la procédure pour chaque espace de travail
Jaster
Cape n'est pas une bonne réponse et les deux autres réponses ci-dessus fonctionnent et sont de par leur conception. Il doit se passer autre chose dans votre environnement.
MrHinsh - Martin Hinshelwood
@MrHinsh - diverses personnes dans le département ont regardé cela et c'est juste cassé. Cela semble OK avec Git, mais lorsque vous utilisez TFVC, il le fait tout le temps.
DaveShaw
0

J'ai eu le même problème. /packagesdevrait fonctionner mais pas pour moi. packages*.*a fonctionné.

coding4fun
la source