在下面的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 \文件夹。我通过在复制任务之前和之后添加消息任务来发现这一点。
答案 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脚本时,目标unzip
和Copy
将在很短的时间内完成,但是,解压缩的实际完成将延迟几秒。因此实际执行了CopyFiles目标。但复制任务不会复制文件(因为解压缩尚未完成)。这就是复制任务第一次没有执行但第二次执行的原因。
因此,要解决此问题,只需在复制目标中编写ItemGroup
。