Як повністю очистити папки bin та obj у Visual Studio?


95

Якщо клацнути правою кнопкою миші на папці, ви побачите пункт меню "Очистити". Я припускав, що це очистить (видалить) каталог obj та bin. Однак, наскільки я бачу, це нічого не робить. Чи є інший спосіб? (будь ласка, не кажіть мені переходити до Провідника Windows або cmd.exe) Я хотів би видалити папку obj та bin, щоб я міг легко застібнути цілу річ.


Відповіді:


104

Оскільки інші вже відповіли, 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 не чистить належним чином, для мене повна загадка.
Рольф

1
Це, безумовно, найпростіше рішення для реалізації та виконання роботи без будь-яких зовнішніх плагінів
tomoguisuru

Не знаю, як активувати / викликати цю ціль. Просто вибравши "Очистити", здається, нічого не робить. То як я ним користуюся?
aliceraunsbaek

вибачте щойно побачив ваш коментар. Вказівка ​​AfterTargets = "Clean" прив'язує ціль до внутрішньої чистої цілі для VisualStudio. Однак ця проста ціль не надає ніякої feedbaco для консолі, тому вона не буде робити багато іншого, крім як знищити ваші $ (OUTDIR) з існування. Ви можете додати до нього деяке управління помилками та повідомлення та отримати кращий відгук.
Ньютопіан,

3
@Rolf Visual Studio за замовчуванням не очищає "належним чином", оскільки MS повинна підтримувати варіант використання, коли N різних проектів виводяться в один каталог. Якщо чистка проекту за замовчуванням заблокувала весь вихідний каталог, це могло б зробити файли clobber, абсолютно не пов'язані з цим проектом. Отже, за замовчуванням поведінка за замовчуванням полягає у відстеженні файлів, які фактично виводяться процесом збірки, та видаленні лише тих файлів на чистому. Поширений клас поломок у чистий час спричинений створенням або копіюванням файлу під час збірки, не кажучи MSBuild додавати його до списку відстеження.
Тімбо

45

Якщо ви використовуєте git і маєте правильний варіант .gitignoreу своєму проекті, можете

git clean -xdf --dry-run

видалити абсолютно кожен файл зі .gitignoreсписку, тобто він буде очищений obj, і binпапки ( xініціює таку поведінку)


2
Це чудово працює. Дуже зручно, коли ви хочете зробити рішення широким, а не лише одним проектом Visual Studio
Ехтеш Чоудхурі,

@JoeHealy Замість очищення спочатку, а потім архівування, можливо, буде простіше використовувати git-archive для архівування безпосередньо з репо.
Reinier Torenbeek

Працює як оберіг! Це найкраща відповідь. Крім того, якщо, припустимо, проект не використовує керування джерелом, ця відповідь все ще застосовується: просто додайте проект до джерела керування (клацніть правою кнопкою миші на назві рішення), а потім запустіть команду git вище. До речі, як ви використовуєте команди git в Windows? Мені довелося використовувати Bash на Ubuntu в Windows.
Бретт

@brett Цікаво;) Я зазвичай використовую GitHub для Windows для мощення (хоча я впевнений, що VS встановлює робочу установку, яку можна використовувати з командного рядка VS) - налаштування дозволяють вибрати розташування оболонки (з яких я вибираю PoshGit) . Використання WSL є найбільш освітнім, тому гарний дзвінок!
Рубен Бартелінк

2
в порядку. тепер я бачу; Ключ полягає в тому --dry-run, що ця інформація лише повідомляє, що буде видалено nice
mkb

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 вручну кожного разу, коли ви хочете зробити покращення.


Чи є якийсь приємний спосіб видалити всі файли в папці, крім однієї конкретної?
progLearner

1
@progLearner Ofcourse є stackoverflow.com/a/10019708/863651
XDS

Чудово! Дякую!
progLearner

1
@progLearner - це складне запитання, щоб правильно відповісти. Здається, деякі файли ще заблоковані, якщо ми зберігаємося 2-3 рази, тоді вони видаляються. Тоді бувають випадки, коли файли справді блокуються, і тоді вам не пощастило, тому що ви не можете їх видалити, доки ви не вб'єте процеси, які їх блокують. Якщо ви перебуваєте у сценарії №1, тоді ви можете спробувати дію каталогу видалення з останньої 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 є значні побічні ефекти, оскільки це знищить усі можливості для поступової збірки. У проектах, на створення яких потрібна значна кількість часу, це шоу-пробка. Також, знищивши базову вихідну папку, ви можете заважати інструментам, які можуть захотіти виконувати багатоцільові / конфігураційні збірки та накопичувати результати до упаковки для розгортання, тут збережеться лише остання виконана збірка.
Ньютопіан,

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" у поле "Маска файлу або кілька масок файлів"
    • Установіть прапорець "Пошук папок"
    • Натисніть клавішу Enter
  3. Після завершення пошуку переключіть вигляд на «Панель» .

  4. Виділіть усі файли (за допомогою Ctrl + A) і видаліть папки (натисніть "Shift + Del")

Сподіваюся, це комусь допомагає.


1
погуглив це питання, шукаючи автоматичного рішення, спеціально зупинити його вручну в FAR Manager, ха-ха
Влад

3

У вікнах просто відкрийте провідник, перейдіть до папки SLN, клацніть у полі пошуку та введіть kind: = folder; obj -> для папок obj використовуйте CTRL + A та видаліть їх - те саме для bin Готово

Не потрібно ніякого інструменту чи додаткового програмного забезпечення;)


2

Це не видаляє папки, але видаляє побічні продукти збірки. Чи є причина, за якою ви хочете видалити фактичні папки збірки ?


Я хотів би видалити все, що не потрібно для компіляції, щоб я міг його заархівувати та надіслати. Наявність .exes у zip-файлах може бути проблемою для антивірусів.
tom7

Так. Але, як я вже сказав, будівельні продукти видаляються. Це означає .obj та .exe файли. Тільки не фактичні папки.
Крістофер

Якщо деякі посилання були видалені / переміщені, а на dll не вказано код, вони більше не вбудовуються в папки кошика, однак вони також не очищаються. Це закінчується локальним проти вашого додатку, який створюється, але не в змозі всюди.
Oli4

2

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

Однак це не видаляє каталоги, в яких ці файли будуються. Я не бачу вагомої причини, чому вам потрібно видаляти каталоги. Можете пояснити далі?

Якщо ви заглянете всередину цих каталогів до і після "Очищення", ви побачите, як скомпільований вивід очищається.


Я хочу видалити каталоги bin та obj, щоб все заархівувати.
tom7

5
"Clean" не видаляє .exe.
tom7

Просто спробував із моєю Visual Studio 2005, і я можу переконатися, що "Clean" видалив .exe (і всі інші файли).
abelenky

4
Можливо, у Visual Studio 2010. Зараз я можу підтвердити, що "Clean Solution" не видаляє dll з папок Debug / bin.
Кіт Хоффман,

4
Clean не видаляє файли, якщо вони не обчислюються збіркою. Якщо деякі файли потрапляють до outdir якимось іншим механізмом, тоді очищення їх не видалить. Іншими словами, коли ви носите шапку менеджера по збірці, чистота є абсолютно і абсолютно марною, навіть небезпечною.
Ньютопіан,

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);
            }
        }
    }
}

1

Я використовую VisualStudioClean, який легко зрозуміти та передбачити. Знання того, як це працює, і які файли він збирається видалити, полегшує мене.

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

Висновок: VisualStudioClean, якщо ви хочете базове очищення, VSClean для більш складного сценарію.


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.

Таким чином, ви просто берете просту програму Форми із шаблонів (якщо у вас ще немає програми ведення домашнього господарства) і додаєте до неї кнопку, а потім 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 для запуску. Таким чином ви можете використовувати його для будь-якого проекту та без префікса ./ імені файлу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.