Visual Studio内のbinおよびobjフォルダーを完全にクリーンアップする方法は?


91

フォルダを右クリックすると、「クリーン」メニュー項目が表示されます。これにより、objおよびbinディレクトリーがクリーン(削除)されると想定しました。しかし、私が見る限り、何もしません。別の方法はありますか?(Windowsエクスプローラーやcmd.exeに移動するように言わないでください)objとbinフォルダーを削除して、簡単に全体を圧縮できるようにします。


回答:


101

他の人がすでに応答しているので、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のパーツを使用して再度編集しますが、.gitignore(または同等のもの)の方が適しているため、.vs削除を削除しました

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>

また、これをプッシュするプロジェクトが複数ある場合に、タスクの展開と保守を容易にすることについても良い提案をしています。

この回答に投票する場合は、両方にも投票してください。


16
これは最良のソリューションであり、機能し、特別なツールを必要とせず、すべてのチームメンバーが同じ「クリーン」な方法を使用することを確実にします。MS Visual Studioが適切にクリーンアップしない理由は、私にとって完全な謎です。
Rolf

1
これは、実装する最も簡単なソリューションであり、外部プラグインなしで作業を完了できます
tomoguisuru

このターゲットをアクティブ化/呼び出す方法がわかりません。「クリーン」を選択しただけでは何も起こりません。それで、それをどのように使用しますか?
aliceraunsbaek 2014年

ごめんなさい、今あなたのコメントを見ました。AfterTargets = "Clean"を指定すると、VisualStudioの内部クリーンターゲットにターゲットがフックされます。ただし、この単純なターゲットはコンソールにフィードバコを提供しないため、$(OUTDIR)が存在しないように消去する以外は何も行いません。エラー管理とメッセージを追加して、より良いフィードバックを得ることができます。
ニュートピア2014

2
MSはN個の異なるプロジェクトが同じディレクトリに出力するユースケースをサポートする必要があるため、@ Rolf Visual Studioはデフォルトで「適切に」クリーンアップしません。プロジェクトをクリーンアップすると、デフォルトでその出力ディレクトリ全体が破壊された場合、そのプロジェクトにまったく関係のないファイルを破壊する可能性があります。したがって、代わりにデフォルトの動作は、ビルドプロセスによって実際に出力されるファイルを追跡し、クリーン時にそれらのファイルのみを削除することです。クリーン時の破損の一般的なクラスは、MSBuildに追跡リストに追加するように指示せずに、ビルド中にファイルを作成またはコピーすることにより発生します。
Timbo

43

gitを使用していて、.gitignoreプロジェクトに正しいものがあれば、次のことができます。

git clean -xdf --dry-run

.gitignoreリストのすべてのファイルを完全に削除します。つまり、、objおよびbinフォルダーをクリーンアップします(xトリガーはこの動作をトリガーします)


2
これは美しく機能します。Visual Studioプロジェクトを1つだけではなくソリューション全体で実行したい場合に非常に便利です
Ehtesh Choudhury 2017

@JoeHealy最初にクリーンアップしてから圧縮する代わりに、git-archive使用してリポジトリから直接圧縮する方が簡単な場合があります。
Reinier Torenbeek

魅力的な作品!これが最良の答えです。また、プロジェクトがソース管理を使用していない場合でも、この回答は適用されます。プロジェクトをソース管理に追加し(ソリューション名を右クリック)、上記のgitコマンドを実行します。ところで、Windowsではgitコマンドをどのように使用しますか?Windows上のUbuntuでBashを使用する必要がありました。
ブレット

@brett Interesting;)通常、GitHub for Windowsを使用して舗装します(ただし、VSはVSコマンドプロンプトから使用できる機能的なリグをインストールすると確信しています)-シェルの配置を選択できます(PoshGitを選択します)。 。WSLを使用することが最も教育的であるため、お電話ください。
Ruben Bartelink 2018

2
OK。わかりました; キーはです--dry-run。これにより、何が削除されるかがわかります。nice
mkb 2018

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フォルダーを削除するのはやり過ぎだと思われる場合は、関連する行をコメント化することをお勧めします。一部のサードパーティプロジェクトでは、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ファイルを手作業で手動で編集する手間をかけずに、1つの場所で追加のクリーンアップロジックを一元的に強化または微調整できます。


特定のファイルを除いて、フォルダー内のすべてのファイルを削除する方法はありますか?
progLearner

1
@progLearnerもちろん、stackoverflow.com
XDS

驚くばかり!ありがとう!
progLearner

1
@progLearner正しく答えるのは難しい質問です。一部のファイルは、2〜3回保持するとロックされているように見えますが、削除されます。次に、ファイルが本当にロックされている場合があります。ファイルをロックしているプロセスを強制終了するまで削除できないため、ファイルを削除できません。シナリオ#1の場合は、persist-deleteフラグが設定されている最新のMSBuildCommunityTasksからディレクトリ削除アクションを試すことができます(このスレッドのスコープ外であるため、このスレッドに関するドキュメントを読むことができます)
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をフックすると、インクリメンタルビルドを実行する可能性がすべてなくなるため、重大な副作用があります。構築にかなりの時間がかかるプロジェクトでは、これはショーストッパーです。また、ベース出力ディレクトリを一掃することにより、マルチターゲット/構成ビルドを実行する必要があるツールに干渉し、展開用にパッケージ化する前に結果を累積することができます。ここでは、最後に実行されたビルドのみが存続します。
ニュートピア2014

21

このサイト:https : //sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/は、William Kempfのpowershellコマンドを使用して、現在のディレクトリからbinおよびobjフォルダーを削除し、サブディレクトリ。ドライブのルートから実行できるはずです。

こちらがウィリアムのバージョンです

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

ウィリアム自身の言葉で:

これにより、現在のディレクトリおよびすべてのサブディレクトリ内の「bin」および「obj」ディレクトリがすべて消去されます。特に誰かが混乱し、IDE内のCleanまたはRebuildがキャッチしない何かがある場合に、ワークスペースディレクトリで実行して「クリーン」な状態にするのに非常に便利です。

ご存知ないかもしれませんが、PowerShellはコマンドエイリアスをサポートしています。ここでは、エイリアスを使用せずに再度書き換えられます

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

注:これをPowerShellファイルに保存し、そのファイルをソリューションのルート(.slnファイルが存在する場所)に配置し、適切なクリーンアップが必要なときに実行します(VisualStudioが行うミッキーマウスではありません)。成功も報告します)。


mercurialなどのバージョン管理システムを使用していて、このスクリプトと同じディレクトリレベルにある場合、「bin」フォルダ内にリポジトリを保存すると、このスクリプトによってリポジトリが破損することに注意してください。それ以外の場合は、便利なスクリプト!
Loudenvier


4

Far Managerでbinおよびobjフォルダーを簡単に見つけて削除できます。

  1. ソリューションに移動し、Alt + F7を押します
  2. 検索設定ダイアログで:

    • ファイルマスクまたは複数のファイルマスク」フィールドに「bin、obj」と入力します
    • 「フォルダを検索」オプションをチェックします
    • Enterキーを押します
  3. 検索が完了したら、ビューを[パネル]に切り替えます

  4. すべてのファイルを選択し(Ctrl + Aで)、フォルダーを削除します(「Shift + Del」を押します)

それが誰かを助けることを願っています。


1
FAR Managerで手動で行うのをやめるための自動ソリューションを探してこの質問をグーグルlol
Vlad

3

ウィンドウでエクスプローラを開き、SLNフォルダに移動して検索フィールドをクリックし、kind:= folder; obj- > と入力します。obj フォルダの場合はCTRL + Aを使用して削除します。binの場合は同じです。

ツールや追加のソフトウェアは必要ありません;)


2

フォルダーは削除されませんが、ビルドの副産物は削除されます。実際のビルドフォルダーを削除する理由はありますか?


zipして送信できるように、コンパイルに不要なものはすべて削除したいのですが。.exeをzipファイルに含めると、ウイルス対策の問題になる可能性があります。
tom7 2009

はい。しかし、言ったように、ビルド製品は削除されます。つまり、.objファイルと.exeファイルです。実際のフォルダではありません。
クリストファー

参照の一部が削除または移動され、DLLがコードで参照されなかった場合、それらはbinフォルダーに組み込まれなくなりましたが、クリーンアップされません。これは、ビルドするアプリケーションのローカルvsで終わりますが、他の場所では失敗します。
Oli4 2018年

2

Cleanは、.objファイルや.exeまたは.dllファイルなど、ビルドプロセスによって作成されたすべての中間ファイルと最終ファイルを削除します。

ただし、これらのファイルがビルドされるディレクトリは削除されません。ディレクトリを削除する必要がある理由がわかりません。さらに説明できますか?

「クリーン」の前後にこれらのディレクトリを見ると、コンパイルされた出力がクリーンアップされていることがわかります。


すべてを圧縮するために、binおよびobjディレクトリを削除したいと思います。
tom7 2009

5
「クリーン」は.exeを削除しません。
tom7 2009

Visual Studio 2005で試してみたところ、「クリーン」で.exe(およびその他すべてのファイル)が削除されたことを確認できました。
abelenky 2009

4
Visual Studio 2010では、たぶん。現在、「クリーンソリューション」でDebug / binフォルダーからdllが削除されないことを確認できます。
キースホフマン

4
Cleanは、ビルドで計算されていないファイルを削除しません。他のメカニズムによっていくつかのファイルが外に移動した場合、cleanはそれらを削除しません。つまり、ビルドマネージャーの帽子をかぶっているとき、クリーンは完全にそしてまったく役に立たず、危険ですらあります。
ニュートピア2012

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

「BeforeBuild」ターゲットアクションが実行される前に「edmxResourcesToembed」が作成されると思います。


2

Joeの回答に基づいて、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はより高度なものです。1つの設定ミスにより、ソースコードが失われます。構成がどのように機能するかをテストするには、多くの時間がかかるすべてのプロジェクトをバックアップする必要があるため、結局、代わりに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

覚えておくべきことの1つは、ファイルシステムの削除が簡単に失敗する可能性があることです。私のお気に入りの1つは、管理者特権で実行中にVisual Studioによって作成されたアイテムが含まれているため、フォルダーを削除できないことに気付いたときです(サービスをデバッグできるようにするため)。

手動でアクセス許可を付与する必要がありました。あるいは、アプリを昇格された特権で実行したと思います。どちらにしても、特にGUIに基づく対話型のアプローチをスクリプトに使用することにはいくつかの価値があると思います。これは、長い一日の終わりに行われる可能性が高く、後でバックアップを確認したくないためです。実際には存在しません...


0

更新:Visual Studio 2019(リリース前に[bin]および[obj]をクリーンアップ)。ただし、[obj]を削除する必要があるかどうかはわかりません。nugetパッケージ構成も配置されていることに注意してください。必要に応じて、2行目を削除できます。

<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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.