¿Cómo limpiar completamente las carpetas bin y obj dentro de Visual Studio?

96

Si hace clic derecho en una carpeta, verá un elemento de menú "Limpiar". Supuse que esto limpiaría (eliminaría) el directorio obj y bin. Sin embargo, por lo que puedo ver, no hace nada. ¿Hay otra manera? (por favor, no me diga que vaya al Explorador de Windows o al cmd.exe) Me gustaría eliminar la carpeta obj y bin para poder comprimir todo fácilmente.

tom7
fuente

Respuestas:

105

Como otros ya han respondido, Clean eliminará todos los artefactos generados por la compilación. Pero dejará atrás todo lo demás.

Si tiene algunas personalizaciones en su proyecto de MSBuild, esto podría significar problemas y dejar atrás cosas que pensaría que debería haber eliminado.

Puede evitar este problema con un simple cambio en su. * Proj agregando esto en algún lugar cerca del final:

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

Lo que eliminará todo en su carpeta bin de la plataforma / configuración actual.

------ Edite una ligera evolución basada en la respuesta de Shaman a continuación (comparta los votos y dele algunos también)

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

---- Edite de nuevo con partes de xDisruptor pero eliminé la eliminación de .vs ya que esto sería mejor servido en un .gitignore (o equivalente)

Actualizado para 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>

También proporciona una buena sugerencia sobre cómo hacer que la tarea sea más fácil de implementar y mantener si tiene varios proyectos para impulsar esto.

Si vota esta respuesta, asegúrese de votar a ambos también.

Newtopian
fuente
17
Esta es la mejor solución, funciona, no requiere herramientas especiales y se asegura de que todos los miembros del equipo utilicen el mismo método "limpio". Por qué MS Visual Studio no limpia correctamente es un completo misterio para mí.
Rolf
1
Esta es, con mucho, la solución más fácil de implementar y hace el trabajo sin complementos externos
tomoguisuru
No estoy seguro de cómo activar / llamar a este objetivo. Simplemente elegir 'Limpiar' no parece hacer nada. Entonces, ¿cómo lo uso?
aliceraunsbaek
Lo siento, acabo de ver tu comentario. Especificar AfterTargets = "Clean" conectará el destino al destino limpio interno para VisualStudio. Sin embargo, este objetivo simple no proporciona ningún feedbaco a la consola, por lo que no hará mucho más que borrar su $ (OUTDIR) de la existencia. Puede agregarle algunos mensajes y administración de errores y obtener mejores comentarios.
Newtopian
3
@Rolf Visual Studio no limpia "correctamente" de forma predeterminada porque MS tiene que admitir el caso de uso en el que N proyectos diferentes salen al mismo directorio. Si limpiar un proyecto golpeó todo su directorio de salida de forma predeterminada, podría golpear archivos que no estén relacionados con ese proyecto. Entonces, en cambio, el comportamiento predeterminado es realizar un seguimiento de los archivos que realmente son generados por el proceso de compilación y eliminar solo esos archivos en limpio. Una clase común de rotura en tiempo de limpieza se debe a la creación o copia de un archivo durante la compilación sin decirle a MSBuild que lo agregue a la lista de seguimiento.
Timbo
45

Si está usando git y tiene una corrección .gitignoreen su proyecto, puede

git clean -xdf --dry-run

para eliminar absolutamente todos los archivos de la .gitignorelista, es decir, se limpiarán objy las bincarpetas (lo que xdesencadena este comportamiento)

Ruben Bartelink
fuente
2
Esto funciona de maravilla. Muy conveniente cuando desea hacer una solución amplia en lugar de solo un proyecto de Visual Studio
Ehtesh Choudhury
@JoeHealy En lugar de limpiar primero y luego comprimir, podría ser más fácil usar git-archive para comprimir directamente desde el repositorio.
Reinier Torenbeek
¡Funciona de maravilla! Esta es la mejor respuesta. Además, si, digamos que el proyecto no está usando control de fuente, esta respuesta aún se aplica: simplemente agregue el proyecto al control de fuente (haga clic derecho en el nombre de la solución), luego ejecute el comando git anterior. Por cierto, ¿cómo se usan los comandos git en Windows? Tuve que usar Bash en Ubuntu en Windows.
brett
@brett Interesante;) Normalmente uso GitHub para Windows para pavimentar (aunque estoy bastante seguro de que VS instala una plataforma de trabajo que se puede usar desde el símbolo del sistema de VS): la configuración le permite seleccionar una disposición de shell (de la cual elijo PoshGit) . Usar WSL es la decisión más educativa, ¡así que buena decisión!
Ruben Bartelink
2
Okay. ahora veo; la clave es que --dry-runesto solo le indicará lo que se eliminará. nice
mkb
42

Para Visual Studio 2015, las variables de MSBuild han cambiado un poco:

  <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>

Tenga en cuenta que este fragmento también borra la carpeta .vs del directorio raíz de su solución. Es posible que desee comentar la línea asociada si cree que eliminar la carpeta .vs es una exageración. Lo tengo habilitado porque noté que en algunos proyectos de terceros causa problemas cuando existen archivos ala application.config dentro de la carpeta .vs.

Apéndice:

Si desea optimizar la capacidad de mantenimiento de sus soluciones, es posible que desee llevar las cosas un paso más allá y colocar el fragmento anterior en un archivo separado como este:

  <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>

Y luego incluya este archivo al final de todos y cada uno de sus archivos * .csproj así:

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

De esta manera, puede enriquecer o ajustar su lógica de limpieza adicional de forma centralizada, en un solo lugar, sin tener que pasar por las molestias de editar manualmente todos y cada uno de los archivos * .csproj cada vez que desee realizar una mejora.

XDS
fuente
¿Existe alguna forma agradable de eliminar todos los archivos de una carpeta excepto de uno específico?
progLearner
1
@progLearner, por supuesto, hay stackoverflow.com/a/10019708/863651
XDS
¡Increíble! ¡Gracias!
progLearner
1
@progLearner es una pregunta difícil de responder correctamente. Algunos archivos parecen estar bloqueados, si persistimos 2 o 3 veces, se eliminan. Luego, hay casos en los que los archivos están realmente bloqueados y luego no tiene suerte porque no puede eliminarlos a menos que y hasta que elimine los procesos que los bloquean. Si se encuentra en el escenario n. ° 1, puede probar la acción de eliminación de directorio de la última MSBuildCommunityTasks que tiene una marca de eliminación persistente (puede leer los documentos en este porque está fuera del alcance de este hilo en particular)
XDS
1
Tuve un problema similar. Hay un proceso que se ejecuta en segundo plano llamado VSCompiler.exe o algo por el estilo. Puede intentar eliminar este proceso antes de eliminar el directorio y ver si funciona (creo que lo hará). ¡Buena suerte compañero!
XDS
31

Para eliminar bin y obj antes de compilar, agregar al archivo del proyecto:

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

Aquí está el artículo: Cómo eliminar la carpeta bin y / o obj antes de la compilación o implementación

Chamán
fuente
3
También me gusta la idea de eliminar a los intermediarios, sin embargo, el enganche a BeforeBuild tiene efectos secundarios importantes, ya que eliminará todas las posibilidades de realizar compilaciones incrementales. En proyectos que requieren una cantidad significativa de tiempo para construir, esto es un obstáculo. Además, al eliminar el directorio de salida base, puede interferir con las herramientas que pueden querer realizar compilaciones de múltiples objetivos / configuraciones y acumular los resultados antes de empaquetarlo para la implementación, aquí solo sobrevivirá la última compilación realizada.
Newtopian
22

Este sitio: https://sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/ utiliza los comandos powershell de William Kempf para eliminar cualquier carpeta bin y obj del directorio actual y subdirectorios. Debería ser posible ejecutarlo desde la raíz de la unidad.

Aquí está la versión de William

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

En las propias palabras de William:

Eso borra todos los directorios "bin" y "obj" en el directorio actual y todos los subdirectorios. Es muy útil para ejecutar en el directorio de su espacio de trabajo para llegar a un estado "limpio", especialmente cuando alguien se equivoca y hay algo que una limpieza o reconstrucción dentro del IDE no detecta.

Para aquellos de ustedes que leen y no sepan, PowerShell admite alias de comando, aquí se reescribe nuevamente sin usar los alias

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

NOTA: Debe tener esto almacenado en un archivo de PowerShell y colocar ese archivo en la raíz de su solución (donde reside el archivo .sln), y luego ejecutarlo cuando desee una limpieza adecuada (no la de Micky Mouse que hace VisualStudio, e informa el éxito también).

Aran Mulholland
fuente
Tenga en cuenta que si usa un sistema de control de versiones como mercurial y está en el mismo nivel de directorio que este script, este script dañará su repositorio si almacena algo dentro de una carpeta "bin" ... de lo contrario, este es un guión útil!
Loudenvier
12

Echa un vistazo al fantástico CleanProject de código abierto de Ron Jacobs. Incluso se encarga de la cremallera si quieres.

Aquí está el enlace de CodePlex

Stuart
fuente
4

Puede encontrar y eliminar fácilmente las carpetas bin y obj en Far Manager.

  1. Navegue hasta su solución y presione Alt + F7
  2. En el cuadro de diálogo de configuración de búsqueda:

    • Escriba "bin, obj" en el campo "Una máscara de archivo o varias máscaras de archivo"
    • Marque la opción "Buscar carpetas"
    • Presione Entrar
  3. Una vez realizada la búsqueda, cambie la vista a "Panel" .

  4. Seleccione todos los archivos (con Ctrl + A) y elimine carpetas (presione "Shift + Del")

Espero que ayude a alguien.

Fragmento
fuente
1
busqué en Google esta pregunta buscando una solución automática específicamente para dejar de hacerlo manualmente en FAR Manager lol
Vlad
3

En Windows, simplemente abra el explorador, navegue hasta su carpeta SLN, haga clic en el campo de búsqueda y escriba kind: = folder; obj -> para carpetas obj, use CTRL + A y elimínelas, lo mismo para bin Listo

No necesita ninguna herramienta o software adicional;)

Al CoPaine
fuente
2

No elimina las carpetas, pero elimina los subproductos de la compilación. ¿Hay alguna razón por la que desee eliminar las carpetas de compilación reales ?

Christopher
fuente
Me gustaría eliminar todo lo que no sea necesario para la compilación para poder comprimirlo y enviarlo. Tener .exes en archivos zip puede ser un problema para los antivirus.
tom7
Si. Pero como dije, los productos de construcción se eliminan. Eso significa los archivos .obj y .exe. Simplemente no las carpetas reales.
Christopher
Si algunas de las referencias se eliminaron / movieron y no se hizo referencia a los dll en el código, ya no se integrarán en las carpetas bin, sin embargo, tampoco se limpiarán. Esto termina en un vs local de su aplicación que se compila, pero falla en todos los demás lugares.
Oli4
2

Clean eliminará todos los archivos intermedios y finales creados por el proceso de compilación, como archivos .obj y archivos .exe o .dll.

Sin embargo, no elimina los directorios donde se crean esos archivos. No veo una razón convincente por la que necesite eliminar los directorios. ¿Puedes explicarme más?

Si miras dentro de estos directorios antes y después de una "limpieza", deberías ver cómo se limpia la salida compilada.

abelenky
fuente
Quiero eliminar los directorios bin y obj para comprimir todo.
tom7
5
"Limpiar" no elimina el .exe.
tom7
Lo intenté con mi Visual Studio 2005, y puedo verificar que "Limpiar" eliminó el .exe (y todos los demás archivos).
abelenky
4
En Visual Studio 2010, tal vez. En este momento, puedo confirmar que una "Solución limpia" no elimina las DLL de las carpetas Debug / bin.
Keith Hoffman
4
Clean no elimina archivos si la compilación no los calcula. Si algunos archivos viajan al outdir mediante algún otro mecanismo, clean no los eliminará. En otras palabras, cuando se usa el sombrero de gerente de construcción, limpiar es total y absolutamente inútil, incluso peligroso.
Newtopian
2

Todavía no puedo agregar un comentario (no se alcanzó una reputación mínima),
así que dejo esta respuesta para subrayar que:

la acción "BeforeBuild" con <RemoveDir Directories="$(BaseIntermediateOutputPath)" /> es excelente pero, para mí, está en conflicto con un modelo de Entity Framework incluido en el mismo proyecto.

El error que recibo es:

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

Supongo que "edmxResourcesToembed" se crea antes de que se ejecute la acción de destino "BeforeBuild".

Luca Ritossa
fuente
2

Según la respuesta de Joe, convertí el código 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
fuente
1

Utilizo VisualStudioClean, que es fácil de entender y predecible. Saber cómo funciona y qué archivos va a borrar me alivia.

Anteriormente probé VSClean (tenga en cuenta que VisualStudioClean no es VSClean), VSClean es más avanzado, tiene muchas configuraciones que a veces me hacen preguntarme qué archivos va a eliminar. Una mala configuración resultará en la pérdida de mis códigos fuente. Para probar cómo funcionará la configuración, es necesario hacer una copia de seguridad de todos mis proyectos, lo que lleva muchas veces, así que al final elijo VisualStudioClean.

Conclusión: VisualStudioClean si desea una limpieza básica, VSClean para escenarios más complejos.

ComputerMan
fuente
1

Así es como lo hago con un archivo por lotes para eliminar todas las carpetas BIN y OBJ de forma recursiva.

  • Cree un archivo vacío y asígnele el nombre DeleteBinObjFolders.bat
  • Copie y pegue el código siguiente en DeleteBinObjFolders.bat
  • Mueva el archivo DeleteBinObjFolders.bat en la misma carpeta con su archivo de solución (* .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
fuente
0

Almaceno mis proyectos VS terminados guardando solo el código fuente.

Elimino las carpetas BIN, DEBUG, RELEASE, OBJ, ARM y .vs de todos los proyectos.

Esto reduce considerablemente el tamaño del proyecto. El proyecto

debe reconstruirse cuando se saca del almacenamiento.

pollaris
fuente
0

Solo un apéndice a todas las buenas respuestas anteriores en caso de que alguien no se dé cuenta de lo fácil que es en VB / C # automatizar todo el proceso hasta el archivo zip.

Así que solo toma una aplicación de Formularios simple de las plantillas (si aún no tienes una aplicación de limpieza) y le agregas un botón y luego ClickOnce lo instala en tu escritorio sin preocuparte por configuraciones especiales o mucho de nada. Este es todo el código que necesita adjuntar al botón:

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

Una cosa para recordar es que las eliminaciones del sistema de archivos pueden salir mal fácilmente. Uno de mis favoritos fue cuando me di cuenta de que no podía eliminar una carpeta porque contenía elementos creados por Visual Studio mientras se ejecutaba con privilegios elevados (para poder depurar un servicio).

Necesitaba dar permiso manualmente o, supongo, ejecutar la aplicación también con privilegios elevados. De cualquier manera, creo que es valioso utilizar un enfoque interactivo basado en GUI sobre un script, especialmente porque es probable que esto sea algo que se hace al final de un largo día y no querrá descubrir más tarde que su copia de seguridad en realidad no existe ...

saminpa
fuente
0

Actualización: Visual Studio 2019 (Limpiar [bin] y [obj] antes del lanzamiento). Sin embargo, no estoy seguro de si es necesario eliminar [obj]. Tenga en cuenta que también se colocó la configuración del paquete nuget. Puede eliminar la segunda línea si así lo cree.

<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>
ADMITIR
fuente
0

esta respuesta es genial, solo quiero comentar la última parte de la respuesta

NOTA: Debe tener esto almacenado en un archivo de PowerShell y colocar ese archivo en la raíz de su solución (donde reside el archivo .sln), y luego ejecutarlo cuando desee una limpieza adecuada (no la de micky mouse que hace VisualStudio, e informa el éxito también).

Alternativamente, puede agregar lo siguiente a su perfil.ps1

function CleanSolution {
    Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force
}

Set-Alias cs CleanSolution 

Entonces puede usar CleanSolution o cs para ejecutar. De esa manera, puede usarlo para cualquier proyecto y sin el prefijo ./ del nombre del archivo

AzulPositivo
fuente
0

Extensión de Visual Studio

ingrese la descripción de la imagen aquí

Solución de clic derecho: seleccione "Eliminar carpetas bin y obj"

mkdave99
fuente