Msbuild 删除从后生成目标复制的文件和文件夹
我想避免在AfterClean目标中硬编码dll和文件夹名称,有没有一种动态方法可以做到这一点?理想情况下,它只会删除在后构建目标中由副本创建的文件和文件夹 我试图通过更改DestinationFolder以在OutputPath中包含一个子目录来简化这个过程。AfterClean目标此时只需删除该子目录。但是,库的某些DLLImport路径没有考虑该子目录,这会导致崩溃Msbuild 删除从后生成目标复制的文件和文件夹,msbuild,Msbuild,我想避免在AfterClean目标中硬编码dll和文件夹名称,有没有一种动态方法可以做到这一点?理想情况下,它只会删除在后构建目标中由副本创建的文件和文件夹 我试图通过更改DestinationFolder以在OutputPath中包含一个子目录来简化这个过程。AfterClean目标此时只需删除该子目录。但是,库的某些DLLImport路径没有考虑该子目录,这会导致崩溃 <?xml version="1.0" encoding="utf-8"?> <Project Tool
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AfterBuild">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)..\lib\native\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(NativeLibs)" DestinationFolder="$(OutputPath)\%(RecursiveDir)" />
</Target>
<Target Name="AfterClean">
<Delete Files="$(OutputPath)\LumiAPI.dll" />
<Delete Files="$(OutputPath)\LumiCore.dll" />
<Delete Files="$(OutputPath)\LumiInOpAPI.dll" />
<RemoveDir Directories="$(OutputPath)\SPM" />
<RemoveDir Directories="$(OutputPath)\plugin" />
</Target>
</Project>
项目结构:
src
- 消费项目
- ConsumingProject.csproj
- ConsumingProject.sln
- 包裹
- my-project.5.7.0.12
- 建造
- 解放党
- 土生土长的
- 插件
- VenuSvc.dll
- SPM
- sSPM_1.bin
- LumiAPI.dll
- LumiCore.dll
- lumiopapi.dll
- 插件
- 网络45
- 土生土长的
- my-project.5.7.0.12.nupkg
- my-project.5.7.0.12
基本上,我想删除从本机文件夹复制到项目输出的所有文件和文件夹(即LumiAPI.dll、LumiCore.dll、SPM(folder)、eSPM_1.bin等)。但是,我希望它足够通用,以便在本机目录中添加另一个文件夹时,它也会删除这些文件夹/文件。使用单独的目标,列出输入和输出文件,然后在其他两个目标中使用该列表。注意:这使用了
Copy
任务中的DestinationFiles
属性,而不是DestinationFolders
。它可能会打印一些关于将不存在的目录传递给RemoveDir的消息,因为顶级目录在子目录之前就已经被删除了
更新,因为您不想删除根输出目录,因为它仍然有文件,所以认为对任何目标目录应用“仅删除空输出目录”原则可能是最安全的方法。学分归谁
$(输出路径)\%(递归目录)
$(输出路径)\%(递归目录)%(文件名)%(扩展名)
0
$([System.IO.Directory]::GetFiles(“%(DestinationDir)”,“*”,System.IO.SearchOption.AllDirectories.get_Length())
我收到错误“无法删除目录“bin\Debug\\”。对路径“HTA.vshost.exe”的访问被拒绝。”。它不应该删除调试文件夹。请编辑您的问题以澄清a)您的目录结构是什么,b)您到底要删除什么。
<Target Name="GetMyOutputFiles">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)..\lib\native\**\*.*" />
<!--Now add some metadata: output dir and output file-->
<NativeLibs>
<DestinationDir>$(OutputPath)\%(RecursiveDir)</DestinationDir>
<Destination>$(OutputPath)\%(RecursiveDir)%(FileName)%(Extension)</Destination>
</NativeLibs>
</ItemGroup>
</Target>
<Target Name="AfterBuild" DependsOnTargets="GetMyOutputFiles">
<!--Copy one-to-one-->
<Copy SourceFiles="@(NativeLibs)" DestinationFiles="@(NativeLibs->'%(Destination)')" />
</Target>
<Target Name="AfterClean" DependsOnTargets="GetMyOutputFiles">
<Delete Files="@(NativeLibs->'%(Destination)')" />
<!--Find number of files left in each destination directory-->
<ItemGroup>
<NativeLibs>
<NumFiles>0</NumFiles>
<!--Condition is to avoid errors when e.g. running this target multiple times-->
<NumFiles Condition="Exists(%(DestinationDir))">$([System.IO.Directory]::GetFiles("%(DestinationDir)", "*", System.IO.SearchOption.AllDirectories).get_Length())</NumFiles>
</NativeLibs>
</ItemGroup>
<!--Only remove empty directories, use 'Distinct' to skip duplicate directories-->
<RemoveDir Directories="@(NativeLibs->'%(DestinationDir)'->Distinct())" Condition="%(NumFiles)=='0'" />
</Target>