Синтаксис задачи MSBuild для удаления файлов


Я пытаюсь написать задачу MSBuild, которая удаляет каталог Obj и PDBs из моей папки bin в моих сценариях сборки производства и, похоже, не может заставить ее работать правильно.

есть ли у кого-нибудь пример, где они делают это или подобное, или ссылка на простой пример удаления файлов и каталога с MSBuild?

8 64

8 ответов:

Если вы хотите удалить весь каталог требуется RemoveDir задачи:

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

и если вы хотите удалить файлы PDB из bin, вам понадобится удалить задачи:

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

обратите внимание, что вы не можете использовать подстановочные знаки в задаче удаления, поэтому, если у вас есть несколько файлов pdb, вы должны предоставить ItemGroup в качестве аргумента.

вы можете сначала удалить файлы в этих каталогах, а затем сам dir с помощью

<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 &quot;@(FileToDelete)&quot;"/>

этот код настолько уродлив, что он должен прийти с мешком воздушной болезни. ;-) Но это быстро, потому что он не строит список файлов для удаления и т. д.

<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 возвращали "система не может найти указанный файл "вместо" каталог не пуст."На моей машине, похоже, требуется еще один RmDir, если $(BuildFolder) открыт в Проводнике Windows. Антивирусная программа может повлиять на RmDir, как это иногда происходит Subversion но я бы предпочел иметь общую защиту AV, чем (mis)управлять списком исключений.

опубликованные ответы будут работать до тех пор, пока вам придется иметь дело с одним каталогом. Если у вас есть вложенные папки, 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>

также можно сначала удалить свойство readonly из файла и выполнить задачу MSBuild delete.

вот так:

<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#, не уверен) re-re-added DesignTimeResolveAssemblyReferencesInput.cache в папку obj, а также добавлен тег \bin папка (у меня есть разные сборки в разных подпапках под \bin). Он очистил все остальное, включая 25 других конфигураций сборки, которые я импортировал .файлы csproj (да, я знать.)

будьте осторожны, если вы пакетно перестраиваете более одной конфигурации, поскольку она просто стирает все предыдущие усилия по каждой перестройке, оставляя вас только с последним. Упс.

просто чтобы добавить еще одну морщину, которую я обнаружил. Я использую Visual Studio 2015. Опубликованные ответы, которые удаляются с помощью подстановочного знака, по-прежнему вызывают у меня проблемы. Я подозреваю, что символы обрабатываются до сборки, а не после. Это означает, что удаление не произойдет, если файлы, которые вы хотите удалить, будут созданы во время сборки. Это также приводит к замечательному поведению, когда удаление работает каждый второй раз, когда вы строите, что делает все это очень приятным тест.

Я отказываюсь от маски. Для того, что я делаю, я знаю файлы, которые вызывают проблемы, и я жестко кодирую (если это можно назвать внутри файла проекта) фактические имена файлов.