Как полностью очистить папки bin и obj в Visual Studio?

96

Если вы щелкните правой кнопкой мыши папку, вы увидите пункт меню «Очистить». Я предполагал, что это очистит (удалит) каталог obj и bin. Однако, насколько я понимаю, ничего не делает. Есть другой способ? (пожалуйста, не говорите мне идти в проводник Windows или cmd.exe) Я бы хотел удалить папки obj и bin, чтобы я мог легко заархивировать все это.

tom7
источник

Ответы:

105

Поскольку другие уже ответили, Clean удалит все артефакты, созданные сборкой. Но он оставит позади все остальное.

Если у вас есть некоторые настройки в вашем проекте MSBuild, это может вызвать проблемы и оставить после себя вещи, которые, как вы думаете, следовало удалить.

Вы можете обойти эту проблему, просто изменив свой. * Proj, добавив это где-то в конце:

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

Что удалит все в вашей папке bin текущей платформы / конфигурации.

------ Редактировать Незначительная эволюция на основе ответа Шамана ниже (поделитесь голосами и дайте ему тоже)

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

---- Отредактируйте снова с частями из xDisruptor, но я удалил удаление .vs, так как это было бы лучше обслуживать в .gitignore (или эквивалентном)

Обновлено для 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>

Он также дает хорошее предложение по упрощению развертывания и сопровождения задачи, если у вас есть несколько проектов, в которые нужно внедрить это.

Если вы проголосуете за этот ответ, обязательно проголосуйте за них обоих.

Ньютопианец
источник
17
Это лучшее решение, оно работает, не требует специальных инструментов и гарантирует, что каждый член команды использует один и тот же «чистый» метод. Почему MS Visual Studio не очищается должным образом - для меня полная загадка.
Rolf
1
Это, безусловно, самое простое решение для реализации, которое выполняет свою работу без каких-либо внешних плагинов
tomoguisuru
Не знаю, как активировать / вызвать эту цель. Кажется, что простой выбор «Очистить» ничего не дает. Так как мне его использовать?
aliceraunsbaek
жаль только сейчас увидел ваш комментарий. Указание AfterTargets = "Clean" привяжет цель к внутренней чистой цели для VisualStudio. Однако эта простая цель не предоставляет никакой информации для консоли, поэтому она не сделает ничего, кроме уничтожения вашего $ (OUTDIR). Вы можете добавить в него управление ошибками и сообщениями, чтобы получить лучшую обратную связь.
Newtopian
3
@Rolf Visual Studio не очищает "должным образом" по умолчанию, потому что MS должна поддерживать вариант использования, когда N разных проектов выводятся в один и тот же каталог. Если очистка проекта по умолчанию приводила к затиранию всего выходного каталога, это могло привести к затиранию файлов, совершенно не связанных с этим проектом. Поэтому вместо этого по умолчанию отслеживаются файлы, которые фактически выводятся в процессе сборки, и удаляются только эти файлы при чистке. Обычный класс поломки во время чистки вызван созданием или копированием файла во время сборки без указания MSBuild добавить его в список отслеживания.
Тимбо
45

Если вы используете git и .gitignoreв вашем проекте есть правильный , вы можете

git clean -xdf --dry-run

удалить абсолютно каждый файл в .gitignoreсписке, т.е. он очистит obj, и binпапки ( xтриггеры этого поведения)

Рубен Бартелинк
источник
2
Это прекрасно работает. Очень удобно, если вы хотите
создать
@JoeHealy Вместо того, чтобы сначала очистить, а затем заархивировать, было бы проще использовать git-archive для архивирования непосредственно из репозитория.
Reinier Torenbeek
Работает как шарм! Это лучший ответ. Кроме того, если, допустим, проект не использует систему управления версиями, этот ответ по-прежнему актуален: просто добавьте проект в систему управления версиями (щелкните правой кнопкой мыши имя решения), затем запустите команду git выше. Кстати, как вы используете команды git в Windows? Мне пришлось использовать Bash в Ubuntu в Windows.
brett
@brett Интересно;) Я обычно использую GitHub для Windows, чтобы проложить (хотя я почти уверен, что VS устанавливает рабочую установку, которую можно использовать из командной строки VS) - настройки позволяют выбрать расположение оболочки (из которой я выбираю PoshGit) . Использование WSL является наиболее познавательным, так что хороший выбор!
Рубен Бартелинк
2
ОК. Теперь я вижу; ключ в том --dry-run, что это только говорит вам, что будет удалено. nice
mkb 02
42

Для Visual Studio 2015 переменные MSBuild немного изменились:

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

Обратите внимание, что этот фрагмент также удаляет папку .vs из корневого каталога вашего решения. Вы можете закомментировать связанную строку, если считаете, что удаление папки .vs является излишним. Я включил его, потому что заметил, что в некоторых сторонних проектах это вызывает проблемы, когда файлы ala application.config существуют внутри папки .vs.

Дополнение:

Если вы хотите оптимизировать ремонтопригодность своих решений, возможно, вы захотите пойти еще дальше и поместить приведенный выше фрагмент в отдельный файл, например:

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

А затем включите этот файл в самый конец каждого из ваших файлов * .csproj, например:

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

Таким образом, вы можете централизованно, в одном месте, обогатить или точно настроить логику дополнительной очистки, не пытаясь вручную редактировать каждый файл * .csproj каждый раз, когда вы хотите что-то улучшить.

XDS
источник
Есть ли хороший способ удалить все файлы в папке, кроме одной конкретной?
progLearner
1
@progLearner, конечно, есть stackoverflow.com/a/10019708/863651
XDS
Потрясающие! Благодарность!
progLearner
1
@progLearner - это сложный вопрос, на который нужно правильно ответить. Некоторые файлы кажутся заблокированными, но если мы сохраняем их 2 или 3 раза, они удаляются. Кроме того, бывают случаи, когда файлы действительно заблокированы, и тогда вам не повезло, потому что вы не можете удалить их, пока не убьете процессы, блокирующие их. Если вы находитесь в сценарии № 1, вы можете попробовать действие delete-directory из последней версии MSBuildCommunityTasks, у которой есть флаг persist-delete (вы можете прочитать документацию по этому сценарию, потому что он выходит за рамки этого конкретного потока)
XDS
1
У меня была аналогичная проблема. В фоновом режиме выполняется процесс под названием VSCompiler.exe или что-то в этом роде. Вы можете попробовать убить этот процесс, прежде чем удалять каталог, и посмотреть, работает ли он (я думаю, что так и будет). Удачи, дружище!
XDS,
31

Чтобы удалить bin и obj перед сборкой, добавьте в файл проекта:

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

Вот статья: Как удалить папку bin и / или obj перед сборкой или развертыванием

Шаман
источник
3
Мне также нравится идея удаления посредников, однако есть существенные побочные эффекты при подключении к BeforeBuild, так как он уничтожает все возможности для выполнения инкрементных сборок. В проектах, на создание которых уходит много времени, это препятствие для шоу. Кроме того, удалив базовый выходной каталог, вы можете помешать инструментам, которые могут захотеть выполнить многоцелевые / конфигурационные сборки и накапливать результаты до их упаковки для развертывания, здесь останется только последняя выполненная сборка.
Newtopian
22

Этот сайт: https://sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/ использует команды PowerShell Уильяма Кемпфа для удаления любых папок bin и obj из текущего каталога и подкаталоги. Должна быть возможность запускать его из корня диска.

Вот версия Уильяма

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

По словам Уильяма:

Это стирает все каталоги «bin» и «obj» в текущем каталоге и во всех подкаталогах. Очень полезно запускать в каталоге рабочей области, чтобы перейти в «чистое» состояние, особенно когда кто-то испортил и что-то не улавливает при очистке или восстановлении внутри IDE.

Для тех из вас, кто читает, кто может не знать, PowerShell поддерживает псевдонимы команд, здесь он снова переписан без использования псевдонимов.

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

ПРИМЕЧАНИЕ: вы должны сохранить это в файле PowerShell и поместить этот файл в корень вашего решения (где находится файл .sln), а затем запустить его, когда вам нужна правильная очистка (а не та, которую делает VisualStudio, и тоже сообщает об успехе).

Аран Малхолланд
источник
Имейте в виду, что если вы используете систему контроля версий, такую ​​как mercurial, и она находится на том же уровне каталога, что и этот скрипт, этот скрипт повредит ваш репозиторий, если вы сохраните что-либо в нем в папке "bin" ... в противном случае это очень полезный скрипт!
Loudenvier
4

Вы можете легко найти и удалить папки bin и obj в Far Manager.

  1. Перейдите к своему решению и нажмите Alt + F7.
  2. В диалоговом окне настройки поиска:

    • Введите «bin, obj» в поле «Маска файла или несколько масок файла».
    • Отметьте опцию «Искать папки»
    • нажмите Ввод
  3. После завершения поиска переключите вид на «Панель» .

  4. Выделите все файлы (с помощью Ctrl + A) и удалите папки (нажмите «Shift + Del»)

Надеюсь, это кому-то поможет.

Фрагмент
источник
1
погуглил этот вопрос в поисках автоматического решения, специально чтобы перестать делать это вручную в FAR Manager lol
Влад
3

В Windows просто откройте проводник, перейдите в папку SLN, щелкните в поле поиска и введите kind: = folder; obj -> для папок obj используйте CTRL + A и удалите их - то же самое для bin Готово

Нет необходимости в каком-либо инструменте или дополнительном программном обеспечении;)

Аль Копейн
источник
2

Он не удаляет папки, но удаляет побочные продукты сборки. Есть ли причина, по которой вы хотите удалить фактические папки сборки ?

Кристофер
источник
Я бы хотел удалить все, что не нужно для компиляции, чтобы я мог его заархивировать и отправить. Наличие .exes в zip-файлах может стать проблемой для антивирусов.
tom7 06
Да. Но, как я уже сказал, продукты сборки удалены. Это означает файлы .obj и .exe. Только не сами папки.
Christopher
Если некоторые из ссылок были удалены / перемещены, а библиотеки DLL не упоминались в коде, они больше не встраиваются в папки bin, но и не очищаются. Это заканчивается локальным vs вашего приложения, которое строится, но терпит неудачу везде.
Oli4
2

Очистка удалит все промежуточные и окончательные файлы, созданные в процессе сборки, такие как файлы .obj и файлы .exe или .dll.

Однако при этом не удаляются каталоги, в которых создаются эти файлы. Я не вижу веской причины, по которой вам нужно удалить каталоги. Вы можете объяснить дальше?

Если вы заглянете внутрь этих каталогов до и после «Очистки», вы должны увидеть, что ваш скомпилированный вывод очищен.

абеленки
источник
Я хочу удалить каталоги bin и obj, чтобы все заархивировать.
tom7 06
5
«Чистый» не удаляет .exe.
tom7 06
Просто попробовал это с моей Visual Studio 2005, и я могу убедиться, что «Очистка» действительно удалила .exe (и все другие файлы).
abelenky 06
4
Возможно, в Visual Studio 2010. Прямо сейчас я могу подтвердить, что «Чистое решение» не удаляет библиотеки DLL из папок Debug / bin.
Кейт Хоффман
4
Очистка не удаляет файлы, если они не вычислены сборкой. Если некоторые файлы перемещаются на периферию каким-либо другим механизмом, очистка не удалит их. Другими словами, надев шляпу менеджера сборки, чистить совершенно бесполезно, даже опасно.
Newtopian
2

Я пока не могу добавить комментарий (минимальная репутация не достигнута),
поэтому оставляю этот ответ, чтобы подчеркнуть:

Действие «BeforeBuild» <RemoveDir Directories="$(BaseIntermediateOutputPath)" />отлично, но, на мой взгляд , оно противоречит модели Entity Framework, включенной в тот же проект.

Я получаю следующее сообщение об ошибке:

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

Я полагаю, что "edmxResourcesToembed" создается до выполнения целевого действия "BeforeBuild".

Лука Ритосса
источник
2

Основываясь на ответе Джо, я преобразовал код VB в 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
источник
1

Я использую VisualStudioClean, который прост для понимания и предсказуем. Меня успокаивает знание того, как это работает и какие файлы собираются удалить.

Раньше я пробовал VSClean (обратите внимание, что VisualStudioClean - это не VSClean), VSClean более продвинутый, у него много конфигураций, что иногда заставляет меня задуматься, какие файлы он собирается удалить? Одна неверная конфигурация приведет к потере моих исходных кодов. Чтобы проверить, как будет работать конфигурация, необходимо создать резервную копию всех моих проектов, что занимает много времени, поэтому в конце я выбираю VisualStudioClean.

Вывод: VisualStudioClean, если вам нужна базовая очистка, VSClean для более сложного сценария.

ComputerMan
источник
1

Вот как я делаю с пакетным файлом для рекурсивного удаления всех папок BIN и OBJ.

  • Создайте пустой файл и назовите его DeleteBinObjFolders.bat
  • Скопируйте и вставьте приведенный ниже код в DeleteBinObjFolders.bat.
  • Переместите файл DeleteBinObjFolders.bat в ту же папку, что и файл вашего решения (* .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
Альпер Эбикоглу
источник
0

Я сохраняю свои готовые проекты VS, сохраняя только исходный код.

Я удаляю папки BIN, DEBUG, RELEASE, OBJ, ARM и .vs из всех проектов.

Это значительно уменьшает размер проекта. Проэкт

должны быть восстановлены при извлечении из хранилища.

полларис
источник
0

Просто дополнение ко всем прекрасным ответам выше на случай, если кто-то не понимает, насколько легко в VB / C # автоматизировать весь процесс вплоть до zip-архива.

Итак, вы просто берете простое приложение Forms из шаблонов (если у вас еще нет служебного приложения) и добавляете к нему кнопку, а затем ClickOnce устанавливаете его на свой рабочий стол, не беспокоясь о специальных настройках или многом другом. Это весь код, который вам нужно прикрепить к кнопке:

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

Следует помнить, что при удалении файловой системы легко может произойти сбой. Одним из моих любимых моментов стало то, что я понял, что не могу удалить папку, потому что она содержит элементы, созданные Visual Studio при работе с повышенными привилегиями (чтобы я мог отлаживать службу).

Мне нужно было вручную дать разрешение или, я полагаю, запустить приложение с повышенными привилегиями. В любом случае, я думаю, что есть некоторая ценность в использовании интерактивного подхода на основе графического интерфейса к сценарию, особенно потому, что это, вероятно, что-то, что делается в конце долгого дня, и вы не хотите позже узнавать, что ваша резервная копия на самом деле не существует ...

Саминпа
источник
0

Обновление: Visual Studio 2019 (очистите [bin] и [obj] перед выпуском). Однако я не уверен, нужно ли удалять [obj]. Имейте в виду, что здесь также размещена конфигурация пакета nuget. Если вы так считаете, можете убрать вторую строчку.

<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>
ПРИЗНАТЬСЯ
источник
0

этот ответ отличный, я просто хочу прокомментировать последнюю часть ответа

ПРИМЕЧАНИЕ: вы должны сохранить это в файле PowerShell и поместить этот файл в корень вашего решения (где находится файл .sln), а затем запустить его, когда вам нужна правильная очистка (а не та, которую делает VisualStudio, и тоже сообщает об успехе).

Кроме того, вы можете добавить в свой профиль: ps1

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

Set-Alias cs CleanSolution 

Затем вы можете использовать либо CleanSolution, либо cs для запуска. Таким образом, вы можете использовать его для любого проекта и без префикса ./ имени файла.

СинийПоложительный
источник
0

Расширение Visual Studio

введите описание изображения здесь

Решение, щелкнув правой кнопкой мыши - выберите «Удалить папки bin и obj».

mkdave99
источник