【问题标题】:Remove Files and Folders Copied From AfterBuild Target删除从 AfterBuild 目标复制的文件和文件夹
【发布时间】:2016-08-13 17:44:04
【问题描述】:

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

我试图通过更改 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

    • 我的项目.5.7.0.12

      • 构建

        • 原生

          • 插件

            • VenusDvc.dll
          • SPM

            • sSPM_1.bin
          • LumiAPI.dll

          • LumiCore.dll

          • LumiInOpAPI.dll

        • net45

      • my-project.5.7.0.12.nupkg

基本上我想删除从本机文件夹复制到项目输出的所有文件和文件夹(即 LumiAPI.dll、LumiCore.dll、SPM(文件夹)、eSPM_1.bin 等)。但是我希望它足够通用,这样如果我将另一个文件夹添加到本机目录,它也会删除这些文件夹/文件。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    使用列出输入和输出文件的单独目标,然后在其他两个目标中使用该列表。请注意,这使用来自Copy 任务的DestinationFiles 属性而不是DestinationFolders。它可能会打印一些关于传递给 RemoveDir 的不存在目录的消息,因为顶层目录在子目录之前已经被删除。

    update 因为您不想删除根输出目录,因为它仍然有文件,因此认为对任何目标目录应用“仅在输出目录为空时删除”原则可能是最安全的要走的路。致谢the answer here

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

    【讨论】:

    • 我收到错误消息“无法删除目录“bin\Debug\\”。访问路径“HTA.vshost.exe”被拒绝。”。它不应该删除 Debug 文件夹
    • 请编辑您的问题以澄清 a) 您的目录结构是什么以及 b) 您究竟要删除什么。
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多