Синтаксис задачи 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 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. Опубликованные ответы, которые удаляются с помощью подстановочного знака, по-прежнему вызывают у меня проблемы. Я подозреваю, что символы обрабатываются до сборки, а не после. Это означает, что удаление не произойдет, если файлы, которые вы хотите удалить, будут созданы во время сборки. Это также приводит к замечательному поведению, когда удаление работает каждый второй раз, когда вы строите, что делает все это очень приятным тест.
Я отказываюсь от маски. Для того, что я делаю, я знаю файлы, которые вызывают проблемы, и я жестко кодирую (если это можно назвать внутри файла проекта) фактические имена файлов.