Comment nettoyer complètement les dossiers bin et obj dans Visual Studio?

91

Si vous faites un clic droit sur un dossier, vous verrez un élément de menu «Nettoyer». J'ai supposé que cela nettoyer (supprimer) le répertoire obj et bin. Cependant, pour autant que je sache, cela ne fait rien. Y a-t-il un autre moyen? (s'il vous plaît ne me dites pas d'aller dans l'Explorateur Windows ou le cmd.exe) Je voudrais supprimer le dossier obj et bin afin que je puisse facilement compresser le tout.

tom7
la source

Réponses:

101

Comme d'autres l'ont déjà répondu, Clean supprimera tous les artefacts générés par la construction. Mais cela laissera tout le reste.

Si vous avez des personnalisations dans votre projet MSBuild, cela pourrait entraîner des problèmes et laisser derrière vous des éléments que vous penseriez qu'il aurait dû supprimer.

Vous pouvez contourner ce problème avec une simple modification de votre. * Proj en ajoutant ceci quelque part vers la fin:

<Target Name="SpicNSpan"
        AfterTargets="Clean">
    <RemoveDir Directories="$(OUTDIR)"/>
</Target>

Ce qui supprimera tout ce qui se trouve dans votre dossier bin de la plate-forme / configuration actuelle.

------ Edit Légère évolution basée sur la réponse de Shaman ci-dessous (partagez les votes et donnez-lui aussi)

<Target Name="SpicNSpan"  AfterTargets="Clean">
    <!-- Remove obj folder -->
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <!-- Remove bin folder -->
    <RemoveDir Directories="$(BaseOutputPath)" />
</Target>

---- Modifier à nouveau avec des parties de xDisruptor mais j'ai supprimé la suppression .vs car cela serait mieux servi dans un .gitignore (ou équivalent)

Mis à jour pour VS 2015.

<Target Name="SpicNSpan" AfterTargets="Clean"> <!-- common vars https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396 -->
     <RemoveDir Directories="$(TargetDir)" /> <!-- bin -->
     <RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> <!-- obj -->
</Target>

Il fournit également une bonne suggestion pour rendre la tâche plus facile à déployer et à maintenir si vous avez plusieurs projets dans lesquels pousser cela.

Si vous votez pour cette réponse, assurez-vous de voter pour les deux également.

Newtopian
la source
16
C'est la meilleure solution, fonctionne, ne nécessite pas d'outils spéciaux et garantit que chaque membre de l'équipe utilise la même méthode «propre». Pourquoi MS Visual Studio ne nettoie pas correctement est un mystère complet pour moi.
Rolf
1
C'est de loin la solution la plus simple à mettre en œuvre et fait le travail sans aucun plug
in
Je ne sais pas comment activer / appeler cette cible. Le simple fait de choisir «Nettoyer» ne semble rien faire. Alors, comment puis-je l'utiliser?
aliceraunsbaek
désolé je viens de voir votre commentaire. Spécifier AfterTargets = "Clean" accrochera la cible à la cible propre interne pour VisualStudio. Cependant, cette cible simple ne fournit aucun feedbaco à la console, elle ne fera donc pas grand-chose d'autre que d'effacer votre $ (OUTDIR) de l'existence. Vous pouvez y ajouter une gestion des erreurs et des messages et obtenir de meilleurs commentaires.
Newtopian
2
@Rolf Visual Studio ne nettoie pas "correctement" par défaut car MS doit prendre en charge le cas d'utilisation où N projets différents sortent dans le même répertoire. Si le nettoyage d'un projet écrasait tout son répertoire de sortie par défaut, il pourrait supprimer des fichiers sans aucun rapport avec ce projet. Par conséquent, le comportement par défaut est de garder une trace des fichiers qui sont réellement sortis par le processus de génération et de ne supprimer que ces fichiers lors du nettoyage. Une classe courante de rupture au moment du nettoyage est causée par la création ou la copie d'un fichier pendant la génération sans demander à MSBuild de l'ajouter à la liste de suivi.
Timbo
43

Si vous utilisez git et avez un correct .gitignoredans votre projet, vous pouvez

git clean -xdf --dry-run

supprimer absolument tous les fichiers de la .gitignoreliste, c'est-à-dire qu'il va nettoyer obj, et les bindossiers (ce qui xdéclenche ce comportement)

Ruben Bartelink
la source
2
Cela fonctionne à merveille. Très pratique lorsque vous voulez faire une solution à l'échelle au lieu d'un seul projet Visual Studio
Ehtesh Choudhury
@JoeHealy Au lieu de nettoyer d'abord puis de compresser, il peut être plus facile d' utiliser git-archive pour compresser directement à partir du dépôt.
Reinier Torenbeek
Fonctionne comme un charme! C'est la meilleure réponse. De plus, si, disons que le projet n'utilise pas le contrôle de source, cette réponse s'applique toujours: ajoutez simplement le projet au contrôle de source (clic droit sur le nom de la solution), puis exécutez la commande git ci-dessus. Btw, comment utilisez-vous les commandes git dans Windows? J'ai dû utiliser Bash sur Ubuntu sous Windows.
brett
@brett Intéressant;) J'utilise généralement GitHub pour Windows pour paver (bien que je sois à peu près sûr que VS installe une plate-forme de travail qui peut être utilisée à partir de l'invite de commande VS) - les paramètres vous permettent de sélectionner un arrangement de shell (à partir duquel je choisis PoshGit) . Utiliser WSL est le plus éducatif, donc bon appel!
Ruben Bartelink
2
D'accord. Maintenant, je vois; la clé est que --dry-runcela ne vous dira que ce qui va être supprimé. nice
mkb
42

Pour Visual Studio 2015, les variables MSBuild ont un peu changé:

  <Target Name="SpicNSpan" AfterTargets="Clean"> <!-- common vars https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396 -->
         <RemoveDir Directories="$(TargetDir)" /> <!-- bin -->
         <RemoveDir Directories="$(SolutionDir).vs" /> <!-- .vs -->
         <RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> <!-- obj -->
  </Target>

Notez que cet extrait de code supprime également le dossier .vs du répertoire racine de votre solution. Vous voudrez peut-être commenter la ligne associée si vous pensez que la suppression du dossier .vs est excessive. Je l'ai activé car j'ai remarqué que dans certains projets tiers, cela pose des problèmes lorsque des fichiers ala application.config existent dans le dossier .vs.

Addenda:

Si vous souhaitez optimiser la maintenabilité de vos solutions, vous voudrez peut-être aller plus loin et placer l'extrait de code ci-dessus dans un fichier séparé comme ceci:

  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
       <Target Name="SpicNSpan" AfterTargets="Clean"> <!-- common vars https://msdn.microsoft.com/en-us/library/c02as0cs.aspx?f=255&MSPPError=-2147217396 -->
            <RemoveDir Directories="$(TargetDir)" /> <!-- bin -->
            <RemoveDir Directories="$(SolutionDir).vs" /> <!-- .vs -->
            <RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" /> <!-- obj -->
       </Target>
  </Project>

Et puis incluez ce fichier à la toute fin de chacun de vos fichiers * .csproj comme ceci:

     [...]
     <Import Project="..\..\Tools\ExtraCleanup.targets"/>
  </Project>

De cette façon, vous pouvez enrichir ou affiner votre logique de nettoyage supplémentaire de manière centralisée, en un seul endroit, sans avoir à vous soucier de l'édition manuelle de chaque fichier * .csproj à chaque fois que vous souhaitez apporter une amélioration.

XDS
la source
Existe-t-il un moyen efficace de supprimer tous les fichiers d'un dossier à l'exception d'un en particulier?
progLearner
1
@progLearner bien sûr, il y a stackoverflow.com/a/10019708/863651
XDS
Impressionnant! Merci!
progLearner
1
@progLearner, c'est une question difficile à répondre correctement. Certains fichiers semblent encore verrouillés si nous persistons 2 ou 3 fois, ils sont supprimés. Ensuite, il y a des cas où les fichiers sont vraiment verrouillés et vous n'avez pas de chance car vous ne pouvez pas les supprimer à moins et jusqu'à ce que vous supprimiez les processus les verrouillant. Si vous êtes dans le scénario n ° 1, vous pouvez essayer l'action de suppression de répertoire à partir du dernier MSBuildCommunityTasks qui a un indicateur persist-delete (vous pouvez lire les documents sur celui-ci car il est en dehors de la portée de ce fil particulier)
XDS
1
J'avais un problème similaire. Il existe un processus en cours d'exécution en arrière-plan appelé VSCompiler.exe ou quelque chose à cet effet. Vous pouvez essayer de tuer ce processus avant de supprimer le répertoire et de voir si cela fonctionne (je pense que ce sera le cas). Bonne chance mec!
XDS
31

Pour supprimer bin et obj avant la construction, ajoutez au fichier projet:

<Target Name="BeforeBuild">
    <!-- Remove obj folder -->
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <!-- Remove bin folder -->
    <RemoveDir Directories="$(BaseOutputPath)" />
</Target>

Voici l'article: Comment supprimer le dossier bin et / ou obj avant la construction ou le déploiement

Chaman
la source
3
J'aime aussi l'idée de supprimer les intermédiaires, mais il y a des effets secondaires importants à l'accrochage chez BeforeBuild car cela effacera toutes les possibilités d'effectuer des constructions incrémentielles. Dans les projets qui prennent beaucoup de temps à construire, c'est un coup d'arrêt. De plus, en effaçant le répertoire de sortie de base, vous pouvez interférer avec les outils qui peuvent vouloir effectuer des builds multi-cibles / configuration et cumuler les résultats avant de l'empaqueter pour le déploiement, ici seule la dernière build effectuée survivra.
Newtopian
21

Ce site: https://sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/ utilise les commandes powershell de William Kempf pour supprimer tous les dossiers bin et obj du répertoire actuel et sous-répertoires. Il devrait être possible de l'exécuter à partir de la racine du lecteur.

Voici la version de William

 gci -inc bin,obj -rec | rm -rec -force

Selon les propres mots de William:

Cela efface tous les répertoires «bin» et «obj» du répertoire courant et de chaque sous-répertoire. Super utile à exécuter dans le répertoire de votre espace de travail pour arriver à un état «propre», surtout quand quelqu'un se trompe et qu'il y a quelque chose qu'un nettoyage ou une reconstruction à l'intérieur de l'EDI ne détecte pas.

Pour ceux d'entre vous qui ne le savent peut-être pas, PowerShell prend en charge les alias de commande, ici il est réécrit à nouveau sans utiliser les alias

Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force

REMARQUE: vous devez l'avoir stocké dans un fichier PowerShell et placer ce fichier à la racine de votre solution (où réside le fichier .sln), puis l'exécuter lorsque vous souhaitez un nettoyage approprié (pas celui de la souris micky que VisualStudio fait, et rapporte le succès aussi).

Aran Mulholland
la source
Sachez que si vous utilisez un système de contrôle de version comme mercurial et qu'il est dans le même niveau de répertoire que ce script, ce script corrompra votre référentiel si vous y stockez quelque chose dans un dossier "bin" ... sinon c'est un très script utile!
Loudenvier
12

Vérifiez Ron Jacobs ouvert fantastique source de CleanProject Il prend même soin de la passer comme un éclair si vous aimez.

Voici le lien CodePlex

Stuart
la source
4

Vous pouvez facilement trouver et supprimer les dossiers bin et obj dans Far Manager.

  1. Accédez à votre solution et appuyez sur Alt + F7
  2. Dans la boîte de dialogue des paramètres de recherche:

    • Tapez "bin, obj" dans le champ "Un masque de fichier ou plusieurs masques de fichier"
    • Cochez l'option "Rechercher des dossiers"
    • appuyez sur Entrée
  3. Une fois la recherche terminée, passez à la vue "Panneau" .

  4. Sélectionnez tous les fichiers (avec Ctrl + A) et supprimez les dossiers (appuyez sur «Maj + Suppr»)

J'espère que ça aide quelqu'un.

Fragment
la source
1
googlé cette question à la recherche d'une solution automatique spécifiquement pour arrêter de le faire manuellement dans FAR Manager lol
Vlad
3

Dans Windows, ouvrez simplement l'explorateur, accédez à votre dossier SLN, cliquez dans le champ de recherche et tapez kind: = dossier; obj -> pour les dossiers obj, utilisez CTRL + A et supprimez-les - même chose pour bin Terminé

Pas besoin d'outil ou de logiciel supplémentaire;)

Al CoPaine
la source
2

Il ne supprime pas les dossiers, mais il supprime les sous-produits de construction. Y a-t-il une raison pour laquelle vous souhaitez que les dossiers de construction réels soient supprimés?

Christophe
la source
J'aimerais supprimer tout ce qui n'est pas nécessaire à la compilation afin de pouvoir le compresser et l'envoyer. Avoir des fichiers .ex dans des fichiers zip peut être un problème pour les antivirus.
tom7
Oui. Mais comme je l'ai dit, les produits de construction sont supprimés. Cela signifie les fichiers .obj et .exe. Mais pas les dossiers réels.
Christopher
Si certaines références ont été supprimées / déplacées et que les DLL n'ont pas été référencées dans le code, elles ne sont plus intégrées dans les dossiers bin, mais elles ne sont pas non plus nettoyées. Cela se termine par un vs local de votre application qui se construit, mais échoue partout ailleurs.
Oli4
2

Clean supprimera tous les fichiers intermédiaires et finaux créés par le processus de génération, tels que les fichiers .obj et les fichiers .exe ou .dll.

Cependant, il ne supprime pas les répertoires dans lesquels ces fichiers sont créés. Je ne vois pas de raison convaincante pour laquelle vous devez supprimer les répertoires. Pouvez-vous expliquer davantage?

Si vous regardez à l'intérieur de ces répertoires avant et après un "Clean", vous devriez voir votre sortie compilée être nettoyée.

Abelenky
la source
Je veux supprimer les répertoires bin et obj afin de tout compresser.
tom7
5
«Clean» ne supprime pas le .exe.
tom7
Je viens de l'essayer avec mon Visual Studio 2005, et je peux vérifier que "Clean" a bien supprimé le .exe (et tous les autres fichiers).
abelenky le
4
Dans Visual Studio 2010, peut-être. À l'heure actuelle, je peux confirmer qu'une «solution propre» ne supprime pas les dll des dossiers Debug / bin.
Keith Hoffman
4
Clean ne supprime pas les fichiers s'ils ne sont pas calculés par la compilation. Si certains fichiers sont acheminés vers outdir par un autre mécanisme, clean ne les supprimera pas. En d'autres termes, lorsque vous portez le chapeau du gestionnaire de build, nettoyer est complètement et totalement inutile, voire dangereux.
Newtopian
2

Je ne peux pas encore ajouter de commentaire (pas de réputation minimale atteinte)
donc je laisse cette réponse pour souligner que:

l'action "BeforeBuild" avec <RemoveDir Directories="$(BaseIntermediateOutputPath)" />est géniale mais, pour moi, est en conflit avec un modèle Entity Framework inclus dans le même projet.

L'erreur que je reçois est:

Error reading resource '{mymodel}.csdl' -- 'Could not find a part of the path '{myprojectpath}\obj\Release\edmxResourcesToEmbed\{mymodel}.csdl

Je suppose que le "edmxResourcesToembed" est créé avant que l'action cible "BeforeBuild" ne soit exécutée.

Luca Ritossa
la source
2

Sur la base de la réponse de Joe, j'ai converti le code VB en C #:

/// <summary>
/// Based on code of VSProjCleaner tool (C) 2005 Francesco Balena, Code Archirects
/// </summary>
static class VisualStudioCleaner
{
    public static void Process(string rootDir)
    {
        // Read all the folder names in the specified directory tree
        string[] dirNames = Directory.GetDirectories(rootDir, "*.*", SearchOption.AllDirectories);
        List<string> errorsList = new List<string>();

        // delete any .suo and csproj.user file
        foreach (string dir in dirNames) {
            var files = new List<string>();
            files.AddRange(Directory.GetFiles(dir, "*.suo"));
            files.AddRange(Directory.GetFiles(dir, "*.user"));
            foreach (string fileName in files) {
                try {
                    Console.Write("Deleting {0} ...", fileName);
                    File.Delete(fileName);
                    Console.WriteLine("DONE");
                } catch (Exception ex) {
                    Console.WriteLine();
                    Console.WriteLine(" ERROR: {0}", ex.Message);
                    errorsList.Add(fileName + ": " + ex.Message);
                }
            }
        }

        // Delete all the BIN and OBJ subdirectories
        foreach (string dir in dirNames) {
            string dirName = Path.GetFileName(dir).ToLower();
            if (dirName == "bin" || dirName == "obj") {
                try {
                    Console.Write("Deleting {0} ...", dir);
                    Directory.Delete(dir, true);
                    Console.WriteLine("DONE");
                } catch (Exception ex) {
                    Console.WriteLine();
                    Console.WriteLine(" ERROR: {0}", ex.Message);
                    errorsList.Add(dir + ": " + ex.Message);
                }
            }
        }
        Console.WriteLine(new string('-', 60));
        if (errorsList.Count == 0) {
            Console.WriteLine("All directories and files were removed successfully");
        } else {
            Console.WriteLine("{0} directories or directories couldn't be removed", errorsList.Count);
            Console.WriteLine(new string('-', 60));
            foreach (string msg in errorsList) {
                Console.WriteLine(msg);
            }
        }
    }
}
eka808
la source
1

J'utilise VisualStudioClean qui est facile à comprendre et prévisible. Savoir comment cela fonctionne et quels fichiers il va supprimer me soulage.

Auparavant, j'ai essayé VSClean (notez que VisualStudioClean n'est pas VSClean), VSClean est plus avancé, il a de nombreuses configurations qui me font parfois me demander quels fichiers il va supprimer? Une mauvaise configuration entraînera la perte de mes codes sources. Tester le fonctionnement de la configuration nécessite de sauvegarder tous mes projets, ce qui prend beaucoup de temps, donc à la fin, je choisis VisualStudioClean à la place.

Conclusion: VisualStudioClean si vous voulez un nettoyage de base, VSClean pour un scénario plus complexe.

ComputerMan
la source
1

C'est ainsi que je fais avec un fichier batch pour supprimer tous les dossiers BIN et OBJ de manière récursive.

  • Créez un fichier vide et nommez-le DeleteBinObjFolders.bat
  • Copiez-collez le code ci-dessous dans le DeleteBinObjFolders.bat
  • Déplacez le fichier DeleteBinObjFolders.bat dans le même dossier avec votre fichier de solution (* .sln).
@echo off
@echo Deleting all BIN and OBJ folders...
for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"
@echo BIN and OBJ folders successfully deleted :) Close the window.
pause > nul
Alper Ebicoglu
la source
0

Je stocke mes projets VS terminés en enregistrant uniquement le code source.

Je supprime les dossiers BIN, DEBUG, RELEASE, OBJ, ARM et .vs de tous les projets.

Cela réduit considérablement la taille du projet. Le projet

doit être reconstruit une fois sorti du stockage.

pollaris
la source
0

Juste un addendum à toutes les bonnes réponses ci-dessus au cas où quelqu'un ne se rendrait pas compte à quel point il est facile en VB / C # d'automatiser l'ensemble du processus jusqu'à l'archive zip.

Il vous suffit donc de saisir une simple application Forms à partir des modèles (si vous n'avez pas encore d'application de ménage) et d'y ajouter un bouton, puis de l'installer sur votre bureau sans vous soucier des paramètres spéciaux ou de quoi que ce soit. C'est tout le code dont vous avez besoin pour attacher au bouton:

Imports System.IO.Compression

Private Sub btnArchive_Click(sender As Object, e As EventArgs) Handles btnArchive.Click
    Dim src As String = "C:\Project"
    Dim dest As String = Path.Combine("D:\Archive", "Stub" & Now.ToString("yyyyMMddHHmmss") & ".zip")
    If IsProjectOpen() Then 'You don't want Visual Studio holding a lock on anything while you're deleting folders
        MsgBox("Close projects first, (expletive deleted)", vbOKOnly)
        Exit Sub
    End If
    If MsgBox("Are you sure you want to delete bin and obj folders?", vbOKCancel) = DialogResult.Cancel Then Exit Sub
    If ClearBinAndObj(src) Then ZipFile.CreateFromDirectory(src, dest)
End Sub

Public Function ClearBinAndObj(targetDir As String) As Boolean
    Dim dirstodelete As New List(Of String)
    For Each d As String In My.Computer.FileSystem.GetDirectories(targetDir, FileIO.SearchOption.SearchAllSubDirectories, "bin")
        dirstodelete.Add(d)
    Next
    For Each d As String In My.Computer.FileSystem.GetDirectories(targetDir, FileIO.SearchOption.SearchAllSubDirectories, "obj")
        dirstodelete.Add(d)
    Next
    For Each d In dirstodelete
        Try
            Directory.Delete(d, True)
        Catch ex As Exception
            If MsgBox("Error: " & ex.Message & " - OK to continue?", vbOKCancel) = MsgBoxResult.Cancel Then Return False
        End Try
    Next
    Return True
End Function

Public Function IsProjectOpen()
    For Each clsProcess As Process In Process.GetProcesses()
        If clsProcess.ProcessName.Equals("devenv") Then Return True
    Next
    Return False
End Function

Une chose à retenir est que les suppressions de système de fichiers peuvent facilement mal tourner. L'un de mes favoris a été lorsque j'ai réalisé que je ne pouvais pas supprimer un dossier car il contenait des éléments créés par Visual Studio lors de l'exécution avec des privilèges élevés (afin que je puisse déboguer un service).

J'avais besoin de donner manuellement l'autorisation ou, je suppose, d'exécuter l'application avec des privilèges élevés également. Quoi qu'il en soit, je pense qu'il y a une certaine valeur à utiliser une approche interactive basée sur l'interface graphique sur un script, d'autant plus que c'est probablement quelque chose qui est fait à la fin d'une longue journée et que vous ne voulez pas savoir plus tard que votre sauvegarde n'existe pas réellement ...

saminpa
la source
0

Mise à jour: Visual Studio 2019 (Nettoyez [bin] et [obj] avant la publication). Cependant, je ne sais pas si [obj] doit être supprimé. Sachez qu'une configuration de paquet nuget est également placée. Vous pouvez supprimer la deuxième ligne si vous le pensez.

<Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition="'$(Configuration)' == 'Release'">
  <!--remove bin-->
  <Exec Command="rd /s /q &quot;$(ProjectDir)$(BaseOutputPath)&quot; &amp;&amp; ^" />
  <!--remove obj-->
  <Exec Command="rd /s /q &quot;$(BaseIntermediateOutputPath)Release&quot;" />
</Target>
ADMETTRE
la source