web-dev-qa-db-fra.com

Je veux supprimer tous les dossiers bin et obj pour forcer tous les projets à tout reconstruire

Je travaille avec plusieurs projets et je veux supprimer récursivement tous les dossiers portant le nom 'bin' ou 'obj'. Je suis ainsi sûr que tous les projets reconstruiront tout (parfois le seul moyen de forcer Visual Studio à oublier construit). 

Existe-t-il un moyen rapide d’y parvenir (avec un fichier .bat par exemple) sans avoir à écrire un programme .NET?

200
MichaelD

Cela dépend du shell que vous préférez utiliser.

Si vous utilisez le shell cmd sous Windows, les opérations suivantes devraient fonctionner:

FOR /F "tokens=*" %%G IN ('DIR /B /AD /S bin') DO RMDIR /S /Q "%%G"
FOR /F "tokens=*" %%G IN ('DIR /B /AD /S obj') DO RMDIR /S /Q "%%G"

Si vous utilisez un shell de type bash ou zsh (tel que git bash ou babun sous Windows ou la plupart des shells Linux/OS X), il s'agit d'un moyen beaucoup plus agréable et succinct de faire ce que vous voulez:

find . -iname "bin" | xargs rm -rf
find . -iname "obj" | xargs rm -rf

et cela peut être réduit à une ligne avec un OU:

find . -iname "bin" -o -iname "obj" | xargs rm -rf

Notez que si vos répertoires de noms de fichiers contiennent des espaces ou des guillemets, find enverra ces entrées telles quelles, xargs pouvant être scindés en plusieurs entrées. La solution de contournement sur macOS consiste à utiliser -print0 et -0 afin que les exemples ci-dessus deviennent:

find . -iname "bin" -print0 | xargs -0 rm -rf
find . -iname "obj" -print0 | xargs -0 rm -rf

et:

find . -iname "bin" -o -iname "obj" -print0 | xargs -0 rm -rf

Si vous utilisez Powershell, vous pouvez utiliser ceci:

Get-ChildItem .\ -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }

comme on le voit dans La réponse de Robert H ci-dessous - Assurez-vous de lui attribuer le mérite de la réponse powershell plutôt que de moi si vous choisissez de voter à la hausse :)

Il serait bien sûr sage d’exécuter la commande que vous choisissez d’abord en toute sécurité pour la tester!

313
Steve Willcock

J'ai trouvé ce fil et j'ai eu le bingo. Ce script Power Shell a été un peu plus recherché:

Get-ChildItem .\ -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }

Je pensais partager, étant donné que je n'ai pas trouvé la réponse lorsque je cherchais ici.

194
Robert H.

Cela a fonctionné pour moi:

for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"

Basé sur cette réponse sur superuser.com

63
Daniel Rehner

J'utilise toujours pour ajouter une nouvelle cible sur mes solutions pour y parvenir.

<Target Name="clean_folders">
  <RemoveDir Directories=".\ProjectName\bin" />
  <RemoveDir Directories=".\ProjectName\obj" />
  <RemoveDir Directories="$(ProjectVarName)\bin" />
  <RemoveDir Directories="$(ProjectVarName)\obj" />
</Target>

Et vous pouvez l'appeler en ligne de commande

msbuild /t:clean_folders

Cela peut être votre fichier de commandes.

msbuild /t:clean_folders
PAUSE

J'ai écrit un script PowerShell pour le faire. 

L'avantage est qu'il imprime un résumé des dossiers supprimés et des dossiers ignorés si vous avez spécifié qu'une hiérarchie de sous-dossiers doit être ignorée.

Output example

22
doblak

Rien n'a fonctionné pour moi. Je devais supprimer tous les fichiers des dossiers bin et obj pour le débogage et la publication. Ma solution:

1.Cliquez avec le bouton droit de la souris sur le projet, déchargez-le, cliquez à nouveau avec le bouton droit de la souris sur modifier, allez au bas de la page

2. Insérez

<Target Name="DeleteBinObjFolders" BeforeTargets="Clean">
  <RemoveDir Directories="..\..\Publish" />
  <RemoveDir Directories=".\bin" />
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>

3. Enregistrer, recharger le projet, cliquer avec le bouton droit de la souris sur nettoyer et commencer.

16
Kdefthog

Quelque chose comme ça devrait le faire d'une manière assez élégante, après cible propre:

<Target Name="RemoveObjAndBin" AfterTargets="Clean">
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <RemoveDir Directories="$(TargetDir)" />
</Target>
12
vezenkov

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

7
Shaman

Jetez un coup d'oeil au CleanProject , il supprimera les dossiers bin, les dossiers obj, les dossiers TestResults et les dossiers Resharper. Le code source est également disponible.

3
habakuk

Très semblable aux scripts PowerShell de Steve. Je viens d’ajouter TestResults et des packages, comme cela est nécessaire pour la plupart des projets.

Get-ChildItem .\ -include bin,obj,packages,TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
3
Aboo

Voici la réponse J'ai donné à une question similaire, simple, facile, fonctionne plutôt bien et ne nécessite rien d'autre que ce que vous avez déjà avec Visual Studio.

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.

2
Newtopian

Est-ce que 'clean' n'est pas assez bon? Notez que vous pouvez appeler msbuild avec/t: clean à partir de la ligne de commande.

2
Brian

from Utilisation de Windows PowerShell pour supprimer les dossiers obj, bin et ReSharper

très similaire à Robert H answer avec une syntaxe plus courte 

  1. courir PowerShell
  2. cd (change dir) à la racine de votre dossier de projet
  3. coller et exécuter le script ci-dessous

    dir.\-include bin, obj, resharper * -recurse | foreach ($) {rd $ _. nom complet - Répéteur - Force}

2
Iman Abidi

Sur notre serveur de compilation, nous supprimons explicitement les répertoires bin et obj, via des scripts nant. 

Chaque script de construction de projet est responsable de ses répertoires de sortie/temp. Fonctionne bien comme ça. Ainsi, lorsque nous modifions un projet et en ajoutions un nouveau, nous basons le script sur un script fonctionnel, vous notez l'étape de suppression et vous en occupez.

Si vous le faites sur votre machine de développement logique, je me contenterais de nettoyer via Visual Studio comme d'autres l'ont mentionné.

1
Simeon Pilgrim

J'utilise une légère modification de Robert H qui ignore les erreurs et imprime les fichiers de suppression. Je supprime également les dossiers .vs, _resharper et package:

Get-ChildItem -include bin,obj,packages,'_ReSharper.Caches','.vs' -Force -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse -ErrorAction SilentlyContinue -Verbose}

Il convient également de noter la commande git qui efface toutes les modifications, y compris les fichiers et les répertoires ignorés:

git clean -dfx
1
eugstman

Vous pouvez en fait aller un peu plus loin dans la suggestion de PS et créer un fichier vbs dans le répertoire du projet, comme suit:

Option Explicit
Dim oShell, appCmd
Set oShell  = CreateObject("WScript.Shell")
appCmd      = "powershell -noexit Get-ChildItem .\ -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse -WhatIf }"
oShell.Run appCmd, 4, false

Pour des raisons de sécurité, j'ai inclus le paramètre -WhatIf. Supprimez-le donc si vous êtes satisfait de la liste de la première exécution.

1
KL XL

http://vsclean.codeplex.com/

Outil de ligne de commande qui trouve Visual Studio solutions et exécute le Clean commande sur eux. Cela vous permet de nettoyer les répertoires/bin/* de tous ceux les vieux projets sur lesquels vous traînez votre disque dur

1
Joel Martinez

C'est mon fichier de commandes que j'utilise pour supprimer tous les dossiers BIN et OBJ de manière récursive. 

  1. Créez un fichier vide et nommez-le DeleteBinObjFolders.bat
  2. Copiez-collez le code ci-dessous dans le fichier DeleteBinObjFolders.bat
  3. Déplacez le fichier DeleteBinObjFolders.bat dans le même dossier que le fichier de votre 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

Je déteste les fichiers obj qui jonchent les arbres sources. J'ai l'habitude de configurer les projets de sorte qu'ils génèrent des fichiers obj en dehors de l'arbre source. Pour les projets C # que j'utilise habituellement

 <IntermediateOutputPath>..\..\obj\$(AssemblyName)\$(Configuration)\</IntermediateOutputPath>

Pour les projets C++ 

 IntermediateDirectory="..\..\obj\$(ProjectName)\$(ConfigurationName)"
0
Juozas Kontvainis

Nous avons un gros fichier .SLN avec beaucoup de fichiers de projet. J'ai commencé la politique d'avoir un répertoire "ViewLocal" dans lequel se trouvent tous les fichiers non contrôlés par la source. À l'intérieur de ce répertoire se trouvent un répertoire "Inter" et un répertoire "Out". Pour les fichiers intermédiaires et les fichiers de sortie, respectivement.

Cela facilite évidemment l'accès à votre répertoire 'viewlocal' et effectuez une suppression simple, pour vous débarrasser de tout.

Avant de passer du temps à trouver un moyen de contourner ce problème avec des scripts, vous pouvez penser à configurer quelque chose de similaire.

Je ne mentirai pas cependant, le maintien d'une telle configuration dans une grande organisation s'est avéré… intéressant. Surtout lorsque vous utilisez des technologies telles que QT qui aiment traiter des fichiers et créer des fichiers sources non contrôlés par une source. Mais c'est une toute autre histoire!

0
pj4533

Cela fonctionne bien pour moi: commencez pour/d/r. %% d dans (bin, obj, ClientBin, Generated_Code) @ existe-t-il "%% d" rd/s/q "%% d"

0
Mudit Sharma

Considérant que le fichier PS1 est présent dans le dossier currentFolder (le dossier dans lequel vous devez supprimer les dossiers bin et obj)

$currentPath = $MyInvocation.MyCommand.Path
$currentFolder = Split-Path $currentPath

Get-ChildItem $currentFolder -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
0
ShivanandSK

Un moyen très simple et rapide consiste à utiliser l'utilitaire rimraf npm, installez-le d'abord globalement:

> npm i rimraf -g

Et ensuite, la commande depuis la racine de votre projet est assez simple (vous pouvez la sauvegarder dans un fichier script):

projectRoot> rimraf **/bin **/obj

Pour optimiser l'effet souhaité, vous pouvez exploiter les cibles d'événement du projet (celle que vous pouvez utiliser est BeforeRebuild et lui faire exécuter la commande précédente) qui sont spécifiées dans les documents: https://docs.Microsoft.com/en-us/visualstudio/msbuild/comment-étendre-le-processus-de-construction-de-studio-visuel? view = vs-2017

J'aime l'utilitaire rimraf car il est crossplat et très rapide. Cependant, vous pouvez également utiliser la commande RemoveDir dans le fichier .csproj si vous décidez d'utiliser l'option d'événement cible. L’approche RemoveDir a été bien expliquée dans une autre réponse de @Shaman: https://stackoverflow.com/a/22306653/1534753

0
Vedran Mandić