首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对MSBuild ItemGroup内容的困惑

对MSBuild ItemGroup内容的困惑
EN

Stack Overflow用户
提问于 2015-12-11 03:55:03
回答 1查看 253关注 0票数 0

我正在编写一个MSBuild脚本,其任务是构建一个解决方案,然后将两个项目的构建输出复制到一个统一目录中。很简单。

我正在使用复制任务来完成这一任务。就像这样:

代码语言:javascript
复制
<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目录不包含该新程序集,因为在构建开始时,它不存在于项目输出目录中。但是,如果我再次运行构建文件就在那里,并且会被复制。

这种行为似乎是故意的,但我不知道如何完成任务,而不需要生成批处理文件或类似的东西来执行副本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-11 09:09:19

经典的msbuild评价顺序问题:项目根中的项和属性在解析时基本上是在任何目标运行之前进行评估的。但是,将它们放入目标中,则在目标运行时对它们进行评估。这对您的情况更好,因为您还可以确保一个目标一个接一个地运行,从而使第一个目标看到由后者产生的输出。说明:

代码语言:javascript
复制
<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目标(输出目录仍然是空的)时,您将得到如下所示的输出

代码语言:javascript
复制
OutputFiles1=
.... build output ....
OutputFiles1=
ActualOutputFiles1=Project1\bin\Release\a.dll;......

OutputFiles1总是空的,因为在计算它时,输出目录是空的。但是,ActualOutputFiles1是在构建之后评估的,因此它包含输出目录的内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34215858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档