MSBuild用于删除文件的任务语法

时间:2009-09-25 17:37:07

标签: msbuild msbuild-task

我正在尝试编写一个MSBuild任务,它在我的生产构建脚本上从我的bin文件夹中删除Obj目录和PDB,似乎无法让它正常工作。

有没有人有他们这样做或类似的例子,或者是一个用MSBuild删除文件和目录的简单例子的链接?

8 个答案:

答案 0 :(得分:119)

您可以先删除这些目录中的文件,然后使用

删除目录
<Target Name="SomeTarget">
    <ItemGroup>
        <FilesToDelete Include="Path\To\Obj\**\*"/>
    </ItemGroup>   
    <Delete Files="@(FilesToDelete)" />   
    <RemoveDir Directories="Path\To\Obj\" />
</Target>

答案 1 :(得分:88)

如果您要删除整个目录,则需要RemoveDir任务:

<RemoveDir Directories="Path/To/Obj" />

如果你想从bin中删除PDB文件,你需要Delete任务:

<Delete Files="Path/To/Bin/MyApp.pdb" />

请注意,您无法在删除任务中使用通配符,因此如果您有多个pdb文件,则必须提供ItemGroup作为参数。

答案 2 :(得分:17)

发布可能遇到我遇到的同样问题的其他人。

删除任务无法删除我需要能够执行的只读文件,因为当MSBuild从TFS获取最新文件时,文件将被标记为只读。我使用EXEC命令删除只读文件:

<ItemGroup>
    <FileToDelete Include="c:\temp\fileToDelete.txt"/>
</ItemGroup>
<Exec Command="del /F /Q &quot;@(FileToDelete)&quot;"/>

答案 3 :(得分:6)

只要您必须处理单个目录,发布的答案就会起作用。如果您碰巧有嵌套文件夹,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(&quot;$(OutDir)&quot;))" />
    </ItemGroup>

    <Delete Files="@(FilesToClean)"/>
    <RemoveDir Directories="@(FoldersToClean)" />
</Target>

答案 4 :(得分:4)

这段代码太丑了,应该带一个晕机袋。 ;-)但它很快,因为它没有构建要删除的文件列表等。

<Target Name="DeleteBuildFolder">
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
    <Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
</Target>

需要多少个RmDir命令?足够这么一些RmDir命令返回“系统找不到指定的文件”而不是“目录不为空”。在我的机器上,如果在Windows资源管理器中打开$(BuildFolder),它似乎需要另一个RmDir。防病毒程序可能会影响RmDir,就像偶尔会做Subversion一样,但我宁愿拥有全面的AV保护而不是(错误)管理排除列表。

答案 5 :(得分:4)

也可以先从文件中删除readonly属性,然后执行msbuild delete Task。

像这样:

<Target Name="DeleteFiles">
 <Message Text="Delete File" Importance="high"/>
 <Attrib Files="$(FileToDelete)" ReadOnly="false" />
 <Delete Files="$(FileToDelete)" />
</Target>`

答案 6 :(得分:2)

在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文件夹,它还重新添加了当前{{ 1}}文件夹(我在\bin下的不同子文件夹中有不同的版本)。它清除了其他所有内容,包括我从导入的.csproj文件中获得的其他25个构建配置(是的,我知道)。

如果您批量重建多个配置,请小心,因为它只是擦除了每次重建时的所有先前工作,只留下最后一个。 Whups。

答案 7 :(得分:1)

只是添加一个我发现的皱纹。我正在使用Visual Studio 2015.通过通配符删除的已发布答案对我来说仍然很麻烦。 我怀疑在构建之前评估通配符,而不是在之后。这意味着如果要在构建期间创建要删除的文件,则删除不会发生。它还会导致精彩的行为,即每次构建时删除都会起作用,这使得测试非常有趣。

我放弃了通配符。对于我正在做的事情,我知道导致问题的文件,我是硬编码(如果可以在项目文件中调用它)的实际文件名。