在msbuild中使用带有解压缩任务的复制任务

时间:2017-10-25 19:48:18

标签: c# visual-studio-2015 msbuild msbuild-task

在下面的msbuild脚本中,第一次运行csproject时,以下目标按顺序执行:

1)UnzipDLL
2)DeleteExtraneousDirs

如果我是第二次运行csproject,则会按顺序执行以下目标:

1)UnzipDLL
2)CopyFiles
3)DeleteExtraneousDirs

我不确定为什么" CopyFiles"目标没有第一次运行。我还尝试通过添加" BeforeTargets"," AfterTargets"和/或" DependsOnTargets"来指定目标订单,但是没有运行CopyFiles目标在UnzipDLL目标之后。

另外,如果我将DefaultTargets指定为" UnzipDLL"和" CopyFiles",只有" UnzipDLL"任务运行第一次运行csproject项目和两个任务" UnzipDLL"和" CopyFiles"第二次运行csporjects。

下面是msbuild脚本。谢谢您的帮助!

<Project ToolsVersion="14.0" DefaultTargets="UnzipDLL;CopyFiles;DeleteExtraneousDirs" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
  <PropertyGroup>
    <ReleasePath>..\..\..\..\..\TDS</ReleasePath>
    <RelDirectory>$(ReleasePath)\exe\dll\_rels</RelDirectory>
    <LibDirectory>$(ReleasePath)\exe\dll\lib</LibDirectory>
  </PropertyGroup>
  <ItemGroup>
    <LibFiles Include="$(ReleasePath)\exe\dll\lib\**\*.*;$(ReleasePath)\exe\dll\lib\*.*" />
  </ItemGroup>
  <Target Name="UnzipDLL"> 
     <Unzip ZipFileName="$(ReleasePath)\exe\utils\TDS.Packages.1.0.0.nupkg" 
        TargetDirectory="$(ReleasePath)\exe\dll\" /> 
  </Target>
  <Target Name="CopyFiles">
     <Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ReleasePath)\exe\dll\%(RecursiveDir)" />
  </Target>
  <Target Name="DeleteExtraneousDirs">
     <Delete Files="@(LibFiles)" />
     <RemoveDir Directories="$(RelDirectory);$(LibDirectory)" />
  </Target>
</Project>

更新
至于SergeyL的观点,CopyFiles目标确实被执行了。但复制任务不会将文件从exe \ dll \ lib文件夹复制到exe \ dll \文件夹。我通过在复制任务之前和之后添加消息任务来发现这一点。

1 个答案:

答案 0 :(得分:2)

  

我不确定为什么&#34; CopyFiles&#34;目标没有第一次运行......但是在UnzipDLL目标之后没有运行CopyFiles目标。

问题是ItemGroup。它需要在Copy目标中写入。

msbuild脚本应为:

  <Target Name="CopyFiles">
    <ItemGroup>
      <LibFiles Include="$(ReleasePath)\exe\dll\lib\**\*.*;$(ReleasePath)\exe\dll\lib\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ReleasePath)\exe\dll\%(RecursiveDir)" />   
  </Target>

当我们使用ItemGroup处理批处理文件超出目标时,MSBuild将预处理这些文件。当我们执行MSBuild脚本时,目标unzipCopy将在很短的时间内完成,但是,解压缩的实际完成将延迟几秒。因此实际执行了CopyFiles目标。但复制任务不会复制文件(因为解压缩尚未完成)。这就是复制任务第一次没有执行但第二次执行的原因。

因此,要解决此问题,只需在复制目标中编写ItemGroup