我正在编写一个MSBuild脚本,其任务是构建一个解决方案,然后将两个项目的构建输出复制到一个统一目录中。很简单。
我正在使用复制任务来完成这一任务。就像这样:
<ItemGroup>
<OutputFiles1 Include="Project1\bin\Release\*.*" />
<OutputFiles2 Include="Project2\bin\Release\*.*" />
</ItemGroup>
<Target CopyOutput>
<Copy SourceFiles="@(OutputFiles1)" DestinationFolder="DeployOutput" />
<Copy SourceFiles="@(OutputFiles2)" DestinationFolder="DeployOutput" />
</Target>我遇到的问题是:两个ItemGroup元素在构建脚本启动时包含目录的内容,而不是在解决方案构建完成时包含目录的内容。
因此,例如,如果我在Project1中添加对新程序集的引用,然后运行构建,则DeployOutput目录不包含该新程序集,因为在构建开始时,它不存在于项目输出目录中。但是,如果我再次运行构建,文件就在那里,并且会被复制。
这种行为似乎是故意的,但我不知道如何完成任务,而不需要生成批处理文件或类似的东西来执行副本。
发布于 2015-12-11 09:09:19
经典的msbuild评价顺序问题:项目根中的项和属性在解析时基本上是在任何目标运行之前进行评估的。但是,将它们放入目标中,则在目标运行时对它们进行评估。这对您的情况更好,因为您还可以确保一个目标一个接一个地运行,从而使第一个目标看到由后者产生的输出。说明:
<ItemGroup>
<OutputFiles1 Include="Project1\bin\Release\*.*" />
</ItemGroup>
<Target Name="BuildIt">
<Message Text="OutputFiles1=@(OutputFiles1 )" />
<MSBuild Projects="Project1.vcxproj" Targets="Build" />
</Target>
<Target Name="Copy" DependsOnTargets="BuildIt">
<ItemGroup>
<ActualOutputFiles1 Include="Project1\bin\Release\*.*" />
</ItemGroup>
<Message Text="OutputFiles1=@(OutputFiles1)" />
<Message Text="ActualOutputFiles1=@(ActualOutputFiles1 )" />
</Target>当运行Copy目标(输出目录仍然是空的)时,您将得到如下所示的输出
OutputFiles1=
.... build output ....
OutputFiles1=
ActualOutputFiles1=Project1\bin\Release\a.dll;......OutputFiles1总是空的,因为在计算它时,输出目录是空的。但是,ActualOutputFiles1是在构建之后评估的,因此它包含输出目录的内容。
https://stackoverflow.com/questions/34215858
复制相似问题