我正在尝试编写一个MSBuild任务,该任务将从生产构建脚本中bin文件夹中的Obj目录和PDB删除,并且似乎无法使其正常运行。
有没有人提供执行此操作或类似操作的示例,或指向使用MSBuild删除文件和目录的简单示例的链接?
Answers:
ContinueOnError="true"
为第一次重建添加属性
<Delete Files=...>
任务,并注意到从Visual Studio进行构建时,文件被删除,并且在输出中看到了该信息。但是,当我运行它时,它具有msbuild命令行,但不会删除文件,无论输出的详细程度如何,我在输出中都看不到它。
您可以先删除这些目录中的文件,然后再删除目录本身
<Target Name="SomeTarget">
<ItemGroup>
<FilesToDelete Include="Path\To\Obj\**\*"/>
</ItemGroup>
<Delete Files="@(FilesToDelete)" />
<RemoveDir Directories="Path\To\Obj\" />
</Target>
发布给其他可能遇到我同样问题的人。
Delete任务无法删除只读文件,而我需要这样做,因为当MSBuild从TFS获取最新信息时,这些文件被标记为只读。我使用EXEC命令删除只读文件:
<ItemGroup>
<FileToDelete Include="c:\temp\fileToDelete.txt"/>
</ItemGroup>
<Exec Command="del /F /Q "@(FileToDelete)""/>
del
命令行太长。我的解决方案是将通配符del
直接传递给而不是使用ItemGroup。
只要您必须处理一个目录,发布的答案都将起作用。如果您碰巧有嵌套文件夹,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>
该代码太丑陋了,应该随身带一个晕机包。;-)但是速度很快,因为它没有建立要删除的文件列表等。
<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>
需要多少个RmDir命令?足够了,因此一些RmDir命令返回“系统找不到指定的文件”,而不是“目录不为空”。如果在Windows资源管理器中打开$(BuildFolder),则在我的计算机上似乎还需要另一个RmDir。防病毒程序可能会影响RmDir,就像它偶尔会发生Subversion一样,但我宁愿拥有全面的AV保护,而不是(错误)管理排除列表。
也可以先从文件中删除只读属性,然后执行msbuild delete Task。
像这样:
<Target Name="DeleteFiles">
<Message Text="Delete File" Importance="high"/>
<Attrib Files="$(FileToDelete)" ReadOnly="false" />
<Delete Files="$(FileToDelete)" />
</Target>`
在Visual Studio 2013中,将其添加到我的.csproj文件的末尾,就在</Project>
结束标记之前
<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
)。它清除了所有其他内容,包括我从导入的.csproj文件中获得的其他25个构建配置(是的,我知道)。
如果您批量重建多个配置,请小心,因为它只会抹掉之前每次重建的所有工作,而只剩下最后一个。。
只是为了增加我发现的皱纹。我正在使用Visual Studio2015。通过通配符删除的发布答案对我来说仍然很麻烦。 我怀疑通配符是在构建之前而不是之后进行评估的。这意味着,如果要在构建过程中创建要删除的文件,则不会发生删除。它还会导致美妙的行为,即删除在您第二次构建时就起作用,这使所有这些工作都非常有趣。
我放弃通配符。对于我正在做的事情,我知道会引起麻烦的文件,并且我正在对实际文件名进行硬编码(如果可以在项目文件内部将其称为)。