正如其他人已经回答过的,Clean将删除构建生成的所有工件。但它会留下其他所有东西。
如果您在MSBuild项目中进行了一些自定义,则可能会遇到问题,并留下您认为应该删除的内容。
您可以通过向.*proj添加以下内容来解决此问题:
<Target Name="SpicNSpan"
AfterTargets="Clean">
<RemoveDir Directories="$(OUTDIR)"/>
</Target>
<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>
如果你正在使用Git,并且在你的项目中有一个正确的.gitignore
文件,那么你可以:
git clean -xdf --dry-run
要完全删除 .gitignore
列表中的所有文件,即它将清除 obj
和 bin
文件夹(x
触发此行为)。
注意: 参数 --dry-run
仅模拟操作("Would remove ..."),并向您显示 git 实际上将删除哪些内容。先用 dry-run 进行尝试,然后去掉参数就能真正删除文件和文件夹。
此命令执行完后,您可以使用 dotnet restore mySolution.sln
来恢复所有 NUGET 包。如果您已经打开了开发人员控制台,那么您还可以快速运行 msbuild -m mySolution.sln
(无需打开 Visual Studio)以查看是否成功。
-xdf
和 -d -f -x
的意思是相同的,但我只能通过 git clean -d -f -x
命令获得成功的结果。当我使用 -xdf
时,它只会显示 Would remove \somedirectory
。有人可以解释一下吗? - mkb--dry-run
,这只会告诉你哪些文件将被删除。不错。 - mkbbin
和obj
消失。 - nawfal对于 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文件夹过度了,则可以将相关行注释掉。我启用了它,因为我注意到在某些第三方项目中,如果在.vs文件夹内存在application.config等文件,会导致问题。 <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文件,避免繁琐的工作。在构建项目之前删除bin和obj,请在项目文件中添加以下内容:
<Target Name="BeforeBuild">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>
这个网站:https://sachabarbs.wordpress.com/2014/10/24/powershell-to-clean-visual-studio-binobj-folders/ 使用William Kempf的PowerShell命令从当前目录和子目录中删除任何bin和obj文件夹。 它应该可以从驱动器的根目录运行。
这是William的版本
gci -inc bin,obj -rec | rm -rec -force
以下是William的原话:
这会删除当前目录及其每个子目录中的所有“bin”和“obj”目录。在工作区目录中运行它可使状态变得“干净”,尤其是当有人弄乱了事情,而IDE中的“清理”或“重建”无法解决时,这非常有用。
对于那些可能不知道的读者,PowerShell支持命令别名,在这里我将其重新编写,没有使用别名。
Get-ChildItem -inc bin,obj -rec | Remove-Item -rec -force
注意:你应该将这个保存在一个 PowerShell 文件中,并将该文件放在解决方案的根目录下(即 .sln 文件所在的位置),然后在需要进行适当的清理时运行它(而不是 VisualStudio 执行的那种 Mickey Mouse 清理,它也会报告成功)。
根据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);
}
}
}
}
vcpkg
安装子目录高一级。该文件不是项目的.gitignore的一部分,因此对于Ruben的git clean ...
方法来说很令人困惑。 - Philip Oakley