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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Задача "Удалить" не может удалять файлы readonly, которые мне нужно было сделать, например, когда MSBuild получает последние данные от TFS, файлы помечены как только для чтения. Я использовал команду EXEC для удаления файлов readonly:

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

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

Ответ 5

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

Так же:

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

Ответ 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>

Ответ 7

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

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

Ответ 8

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

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