Msbuild 删除从后生成目标复制的文件和文件夹

Msbuild 删除从后生成目标复制的文件和文件夹,msbuild,Msbuild,我想避免在AfterClean目标中硬编码dll和文件夹名称,有没有一种动态方法可以做到这一点?理想情况下,它只会删除在后构建目标中由副本创建的文件和文件夹 我试图通过更改DestinationFolder以在OutputPath中包含一个子目录来简化这个过程。AfterClean目标此时只需删除该子目录。但是,库的某些DLLImport路径没有考虑该子目录,这会导致崩溃 <?xml version="1.0" encoding="utf-8"?> <Project Tool

我想避免在AfterClean目标中硬编码dll和文件夹名称,有没有一种动态方法可以做到这一点?理想情况下,它只会删除在后构建目标中由副本创建的文件和文件夹

我试图通过更改DestinationFolder以在OutputPath中包含一个子目录来简化这个过程。AfterClean目标此时只需删除该子目录。但是,库的某些DLLImport路径没有考虑该子目录,这会导致崩溃

<?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


基本上,我想删除从本机文件夹复制到项目输出的所有文件和文件夹(即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>