web-dev-qa-db-fra.com

Comment nettoyer les dossiers Visual Studio bin et obj

Si vous faites un clic droit sur un dossier, vous verrez un élément de menu "Nettoyer". J'ai supposé que cela effacerait les répertoires obj et bin… .. Cependant, à ma connaissance, cela ne fait rien. Y a-t-il un autre moyen? la totalité.

61
tom7

Comme d'autres ont déjà répondu, Nettoyer 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 causer des problèmes et laisser derrière vous des éléments que vous penseriez devoir 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 Réponse de Shaman ci-dessous (partagez les votes et donnez-en-en 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)

Mise à 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 vous suggère également de rendre la tâche plus facile à déployer et à gérer si vous avez plusieurs projets à intégrer.

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

78
Newtopian

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 supprime également le dossier .vs du répertoire racine de votre solution. Vous souhaiterez peut-être commenter la ligne associée si vous estimez que la suppression du dossier .vs est excessive. Je l'ai activé parce que j'ai remarqué que dans certains projets tiers, cela posait des problèmes lorsque des fichiers en tant qu'application.config existaient 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 suit:

  <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 ensuite, incluez ce fichier à la fin de chacun de vos fichiers * .csproj comme suit:

     [...]
     <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, au même endroit, sans avoir à modifier manuellement chaque fichier * .csproj à chaque fois que vous souhaitez apporter une amélioration.

31
XDS

Pour supprimer bin et obj avant la construction, ajoutez-le au fichier de 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 compilation ou le déploiement

26
Shaman

Si vous utilisez git et que vous avez un .gitignore correct dans votre projet, vous pouvez 

git clean -xdf --dry-run

supprimer absolument tous les fichiers de la liste .gitignore, c’est-à-dire qu’il va nettoyer les dossiers obj et bin (la x déclenche ce comportement)

22
Ruben Bartelink

Découvrez le fantastique open source de Ron Jacobs CleanProject Il s’occupe même de la compression si vous le souhaitez.

Voici le CodePlex link

12
Stuart

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

Voici la version de Williams

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

En propres mots de Williams

Cela efface tous les répertoires «bin» et «obj» du répertoire courant et de chaque sous-répertoire. Super utile de s’exécuter dans votre répertoire d’espace de travail pour obtenir un état «propre», en particulier lorsque quelqu'un gâche et qu’il ya quelque chose qu’un nettoyage ou une reconstruction dans IDE ne détecte pas.

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

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

REMARQUE: vous devriez l'avoir stockée 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 effectuer un nettoyage correct et signale le succès aussi).

8
Aran Mulholland

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 construits ... Je ne vois pas de raison impérieuse de vouloir supprimer les répertoires .. .. Pouvez-vous expliquer davantage?

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

3
abelenky

Il ne supprime pas les dossiers, mais supprime les sous-produits de construction. Y a-t-il une raison pour laquelle vous voulez que la construction réelle dossiers soit supprimée?

2
Christopher

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

l'action "BeforeBuild" avec <RemoveDir Directories="$(BaseIntermediateOutputPath)" /> est excellente, 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 "edmxResourcesToembed" est créé avant que l'action cible "BeforeBuild" soit exécutée.

2
Luca Ritossa

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

  1. Recherchez votre solution et appuyez sur Alt + F7
  2. Dans le dialogue de réglage de la recherche:

    • Tapez "bin, obj" dans le champ "Un masque de fichier ou plusieurs masques de fichier"
    • Option de vérification "Rechercher des dossiers"
    • Appuyez sur Entrée
  3. Une fois la recherche terminée, basculez l’affichage sur "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.

2
Fragment

Voici comment je fais avec un fichier de commandes 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 fichier DeleteBinObjFolders.bat
  • Déplacez le fichier DeleteBinObjFolders.bat dans le même dossier que 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
1
Alper Ebicoglu

Basé sur 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);
            }
        }
    }
}
1
eka808

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

Auparavant j'avais essayé VSClean (notez que VisualStudioClean n'est pas VSClean), VSClean est plus avancé, il comporte 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. Pour tester le fonctionnement de la configuration, il est nécessaire de sauvegarder tous mes projets, ce qui prend beaucoup de temps. J'ai donc choisi VisualStudioClean.

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

1
ComputerMan

Je stocke mes projets VS finis 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 lorsqu'il est sorti du stockage.

0
pollaris

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

Il vous suffit donc de saisir une application de formulaire simple à partir des modèles (si vous ne possédez pas déjà d'application de maintenance) et de lui ajouter un bouton, puis de l'installer sur votre bureau sans vous soucier des paramètres spéciaux. C'est tout le code que vous devez 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 à garder à l'esprit est que les suppressions de système de fichiers peuvent 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 (pour pouvoir déboguer un service).

Je devais donner la permission manuellement ou, je suppose, exécuter l'application avec des privilèges élevés également. Quoi qu’il en soit, je pense que l’utilisation d’une approche interactive basée sur une interface graphique sur un script présente un intérêt particulier, d’autant plus que c’est quelque chose qui se fait à la fin d’une longue journée et que vous ne voulez pas savoir plus tard que votre sauvegarde est efficace. n'existe pas réellement ...

0
saminpa