我确定有一些我不知道的小事。这就是问题所在:
我有一个包含多个项目的解决方案,每次构建后都会压缩。以下是一个项目中zip创建的示例(在其他项目中它们几乎完全相同):
drawLayer.masksToBounds = true
...
<ItemGroup>
<CopySourceFiles Include="$(OutDir)\**\*.*" Exclude="$(OutDir)\**\*.pdb;$(OutDir)\*.mdf;$(OutDir)\*.ldf;$(OutDir)\*.vshost.*" />
</ItemGroup>
最后一个项目包含链接到压缩文件的链接。所有内容都显示正常,但显然仅在 bin 和 zip_working 文件夹已存在时才显示。即如果我清理解决方案,删除bin文件夹,然后重建,在&#34; zip&#34;中创建的最终zip文件。每个项目的文件夹都是空的......
然后,只有在我再次构建 之后,zip文件才会有内容。
所以我猜测在构建过程中,<Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<MakeDir Directories="$(OutDir)\..\zip_working" />
<!-- first copy the source files specified in the CorySourceFiles ItemGroup above. -->
<Copy SourceFiles="@(CopySourceFiles)" DestinationFiles="@(CopySourceFiles->'$(OutDir)\..\zip_working\%(RecursiveDir)%(Filename)%(Extension)')" />
<!-- Perform the zip by calling the UsingTask. Make sure the DestinationFiles above and the SourceDirectory below are pointing to the same place -->
<Zip SourceDirectory="$(OutDir)\..\zip_working" OutputFilename="$(OutDir)\..\zip\$(ProjectName).zip" />
<!-- Clean up. -->
<RemoveDir Directories="$(OutDir)\..\zip_working" />
</Target>
目标在构建输出文件存在之前运行。听起来不错吗?我完全从Visual Studio中触发构建。
无论如何,我怎样才能确保只有在创建后才能在构建输出文件上运行任务?
适用于Visual Studio 2013 Update 5 / MSBuild 12.0
答案 0 :(得分:3)
如果删除OutDir中的所有内容然后构建项目,则在构建开始之前评估顶级(如在目标内,而不是在目标内)ItemGroup。例如,可以找到一些信息here。换句话说,在构建之前,OutDir $(OutDir)\**\*.*
为空,评估为空,而CopySourceFiles项为空。
解决方案只是将ItemGroup移动到AfterBuild目标中。然后在构建之后对其进行评估,从而获得对outDir中当前文件的正确视图。