用于删除文件的MSBuild任务语法
我试图编写一个MSBuild任务,从我的生产构build脚本中的我的bin文件夹中删除Obj目录和PDB,似乎无法让它正常工作。
有没有人有一个例子,他们这样做或类似的,或链接到一个简单的例子,用MSBuild删除文件和目录?
如果您要删除整个目录,则需要执行RemoveDir任务:
<RemoveDir Directories="Path/To/Obj" />
如果你想从bin中删除PDB文件,你需要删除任务:
<Delete Files="Path/To/Bin/MyApp.pdb" />
请注意,您不能在删除任务中使用通配符,因此如果您有多个pdb文件,则必须提供一个ItemGroup作为参数。
您可以先删除这些目录中的文件,然后删除目录本身
<Target Name="SomeTarget"> <ItemGroup> <FilesToDelete Include="Path\To\Obj\**\*"/> </ItemGroup> <Delete Files="@(FilesToDelete)" /> <RemoveDir Directories="Path\To\Obj\" /> </Target>
为其他人发帖可能遇到了我遇到的同样的问题。
删除任务不能删除只读文件,这是我需要做的,因为当MSBuild从TFS获得最新版本时,这些文件被标记为只读文件。 我使用EXEC命令来删除只读文件:
<ItemGroup> <FileToDelete Include="c:\temp\fileToDelete.txt"/> </ItemGroup> <Exec Command="del /F /Q "@(FileToDelete)""/>
这个代码是如此丑陋,它应该与一个晕机袋。 ;-)但速度很快,因为它不会build立要删除的文件列表等
<Target Name="DeleteBuildFolder"> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> <Exec Command="RmDir /S /Q "$(BuildFolder)"" /> </Target>
需要多less个RmDir命令? 足够多的RmDir命令返回“系统找不到指定的文件”而不是“目录不为空”。 在我的机器上,如果$(BuildFolder)在Windows资源pipe理器中打开,似乎需要另一个RmDir。 防病毒程序可能会影响RmDir,就像它偶尔会出现Subversion一样,但我宁愿拥有全面的AV保护,也不愿意pipe理排除列表。
也可以先从文件中删除只读属性并执行msbuild删除任务。
像这样:
<Target Name="DeleteFiles"> <Message Text="Delete File" Importance="high"/> <Attrib Files="$(FileToDelete)" ReadOnly="false" /> <Delete Files="$(FileToDelete)" /> </Target>`
在Visual Studio 2013中,将其添加到</Project>
结束标记之前的.csproj文件末尾
<Target Name = "clean_folders" AfterTargets="Clean"> <Exec Command = "rd /S /Q obj" /> <Exec Command = "rd /S /Q bin" /> </Target>
起初它似乎没有工作,但我注意到Visual Studio(或R#,不知道)重新添加DesignTimeResolveAssemblyReferencesInput.cache
到obj文件夹,它也重新添加当前的\bin
文件夹(我有不同的在\bin
下build立不同的子文件夹)。 它清除了其他一切,包括我从导入的.csproj文件(是的,我知道)的其他25个构buildconfiguration。
要小心,如果你批量重build多个configuration,因为它只是抹去所有以前的努力,每个重build离开你只有最后一个。 Whups。
只要您需要处理单个目录,发布的答案就可以工作。 如果碰巧有嵌套的文件夹, RemoveDir
将会失败, Directory not empty
错误。
稍微通用的方法也会照顾到嵌套的文件夹:
<Target Name="CleanOutDir"> <ItemGroup> <FilesToClean Include="$(OutDir)\**\*.*" /> <!-- Bit of .Net to get all folders and subfolders --> <FoldersToClean Include="$([System.IO.Directory]::GetDirectories("$(OutDir)"))" /> </ItemGroup> <Delete Files="@(FilesToClean)"/> <RemoveDir Directories="@(FoldersToClean)" /> </Target>
只是添加一个我发现的皱纹。 我正在使用Visual Studio 2015.通过通配符删除已发布的答案仍然是我的麻烦。 我怀疑通配符在构build之前进行了评估,而不是在之后 。 这意味着如果要删除的文件是在构build过程中创build的,则不会发生删除操作。 这也导致了你每次build立的删除工作的美妙行为,这使得这一切都非常愉快的testing。
我放弃了通配符。 对于我在做什么,我知道造成麻烦的文件,我硬编码(如果它可以被称为内部的项目文件)实际的文件名。