Синтаксис задачи MSBuild для удаления файлов
Я пытаюсь написать задачу MSBuild, которая удаляет каталог Obj и PDBs из моей папки bin в моих сценариях сборки и, похоже, не может заставить ее работать правильно.
есть ли у кого-нибудь пример, где они делают это или подобное, или ссылка на простой пример удаления файлов и каталога с MSBuild?
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 "@(FileToDelete)""/>
этот код настолько уродлив, что он должен поставляться с мешком для воздушной болезни. ;-) Но это быстро, потому что он не строит список файлов для удаления и т. д.
<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, чем (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("$(OutDir)"))" />
</ItemGroup>
<Delete Files="@(FilesToClean)"/>
<RemoveDir Directories="@(FoldersToClean)" />
</Target>
также можно сначала удалить свойство readonly из файла и выполнить задачу удаления msbuild.
вот так:
<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
). Он очистил все остальное, включая 25 других конфигураций сборки, которые я импортировал .файлы csproj (да, я знать.)
будьте осторожны, если вы перестраиваете несколько конфигураций, так как он просто стирает все предыдущие усилия при каждом перестроении, оставляя вам только последний. Упс.
просто чтобы добавить еще одну морщинку, которую я обнаружил. Я использую Visual Studio 2015. Опубликованные ответы, которые удаляются с помощью подстановочного знака, по-прежнему вызывают у меня проблемы. Я подозреваю, что символы обрабатываются до сборки, а не после. Это означает, что удаление не произойдет, если файлы, которые вы хотите удалить, будут созданы во время сборки. Это также приводит к замечательному поведению, где удаление работает каждый второй раз, когда вы строите, что делает все это очень приятным для тест.
Я отказываюсь от маски. Для того, что я делаю, я знаю файлы, которые вызывают проблемы, и я жестко кодирую (если это можно назвать внутри файла проекта) фактические имена файлов.