Синтаксис 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 "@(FileToDelete)""/>
Ответ 4
Этот код настолько уродлив, что он должен появиться с мешком с воздушным движением.;-) Но это быстро, потому что он не создает список файлов для удаления и т.д.
<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 вернули "Система не может найти указанный файл" вместо "Каталог не пуст". На моей машине, кажется, требуется еще один 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("$(OutDir)"))" />
</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. Опубликованные ответы, которые удаляются с помощью подстановочных знаков, по-прежнему хлопотны для меня. Я подозреваю, что подстановочные знаки оцениваются до сборки, а не после. Это означает, что удаление не произойдет, если файлы, которые вы хотите удалить, создаются во время сборки. Это также приводит к замечательному поведению, когда удаление работает каждый второй раз, когда вы строите, что делает все это очень приятным для тестирования.
Я отказываюсь от подстановочных знаков. Для того, что я делаю, я знаю файлы, которые вызывают проблемы, и я жестко кодирую (если это можно назвать внутри файла проекта) фактическими именами файлов.