it-swarm.com.ru

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

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

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

67
Chris Marisic

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

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

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

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

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

88
Gavin Miller

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

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

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

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

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

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

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

Вот так:

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

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

<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-защиту, а не (неправильно) управлять списком исключений.

4
Mark Jerde

В 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.

2
CAD bloke

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

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

1
rrreee