msbuild - 删除从 AfterBuild 目标复制的文件和文件夹

标签 msbuild

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

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

项目结构:

源代码

  • 消费项目

    • 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

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

最佳答案

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

更新因为您不想删除根输出目录,因为它仍然有文件,所以认为对任何目标目录应用“仅删除输出目录(如果它是空的)”原则可能是最安全的要走的路。积分转到 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>

关于msbuild - 删除从 AfterBuild 目标复制的文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935399/

相关文章:

c# - MSB4242 : The SDK resolver "Microsoft.DotNet.MSBuildSdkResolver" failed to run. 路径中有非法字符

visual-studio-2013 - Visual Studio MSBuild 错误

windows-mobile - 从命令行创建 .inf 文件(使用 msbuild)

msbuild - 如何设置 msbuild 包的输出目录?

c# - SGEN : An attempt was made to load an assembly with an incorrect format

msbuild - 使用 MSBuild/Web 部署项目启动程序而不等待它

.net - NUnit 和与 Jenkins 的持续集成 : which NUnit-files are needed?

asp.net - 使用 MSBUILD 和/或 MSDEPLOY (.NET 3.5) 从命令行进行部署

c# - 无法从传输连接读取数据 : An existing connection was forcibly closed by the remote host

powershell - 哪个工具/技术 : System management for databases and dependent services