実動ビルドスクリプトのbinフォルダーからObjディレクトリーとPDBを削除するMSBuildタスクを作成しようとしていますが、正しく動作しないようです。
誰かがこれを行うか類似した例、またはMSBuildでファイルとディレクトリを削除する簡単な例へのリンクを持っていますか?
これらのディレクトリ内のファイルを最初に削除し、次にディレクトリ自体を削除できます
<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)""/>
投稿された回答は、単一のディレクトリを処理する必要がある限り機能します。フォルダーがネストされている場合、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>
このコードは非常にいため、飛行機酔い袋が付属しています。 ;-)しかし、削除するファイルのリストなどを作成しないため、高速です。
<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コマンドが、「ディレクトリが空ではありません」ではなく、「指定されたファイルが見つかりません」を返します。私のマシンでは、Windowsエクスプローラーで$(BuildFolder)が開いている場合、別のRmDirを使用するようです。アンチウイルスプログラムはRmDirに影響する場合がありますが、ときどきSubversionを実行しますが、除外リストを(誤って)管理するよりも、包括的なAV保護が必要です。
最初にファイルから読み取り専用プロパティを削除し、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#、不明)がDesignTimeResolveAssemblyReferencesInput.cache
をobjフォルダーに再追加し、現在の\bin
も再追加したことに気付きました。フォルダー(\bin
の下の異なるサブフォルダーに異なるビルドがあります)。インポートされた.csprojファイルから私が持っている他の25のビルド構成を含む、他のすべてを削除しました(はい、私は知っています)。
複数の設定を一括再構築する場合は、各再構築の以前のすべての作業が消去されるため、最後の設定のみが残されるので注意してください。ふむ。
私が発見したもう1つのしわを追加するだけです。私はVisual Studio 2015を使用しています。ワイルドカードを使用して削除する投稿された回答は、まだ面倒です。 ワイルドカードはビルド後ではなくビルド前に評価されると思われます。つまり、削除するファイルがビルド中に作成された場合、削除は行われません。また、ビルドするたびに削除が機能するというすばらしい動作につながります。これにより、テストが非常に楽しくなります。
ワイルドカードをあきらめています。私がやっていることについて、私は問題を引き起こしているファイルを知っており、実際のファイル名をハードコーディングしています(プロジェクトファイル内で呼び出すことができる場合)。