在 msbuild 中使用复制任务和解压缩任务

Using copy task with unzip task in msbuild

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

1) 解压 DLL
2) 删除外部目录

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

1) 解压 DLL
2) 复制文件
3) 删除外部目录

我不确定为什么 "CopyFiles" 目标第一次没有 运行。我还尝试通过添加 "BeforeTargets"、"AfterTargets"、and/or "DependsOnTargets" 来指定目标命令,但这并不是在 UnzipDLL 目标之后 运行 CopyFiles 目标。

此外,如果我将 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\ 文件夹。我通过在复制任务前后添加消息任务发现了这一点。

I'm not sure why the "CopyFiles" target doesn't run the first time... but that didn't run the CopyFiles target after the UnzipDLL target.

问题是 ItemGroup。需要写在Copy target里面。

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