2011-05-12 97 views
3

我有一个建设项目,目标构建的范围构建过程中MSBuild任务和属性

<Target Name="Build"> 
    <Message Text="Version : $(FullVersionNr)" /> 
    <MSBuild Projects="@(WebProj)" Properties="WebProjectOutputDir=$(SitePublishPath);OutDir=$(SitePublishPath1);Configuration=$(Configuration)" />  
<Message Text="Version : $(FullVersionNr)" /> 

,我设置$(FullVersionNr),以准确的集结号,它不是这个NR末

我甚至宣称$(FullVersionNr)道具在另一个文件

<Import Project="Common.proj"/> 

,它是不是G排除。

这只是单向通信从父到子的项目,我希望它是双向

回答

1

这MSDN文章应该给你如何实现这一目标的一些想法:MSBuild Properties。更具体地说,这篇博文应该回答你的范围问题:Scope of properties and item in an MSBuild script。请务必在最后阅读摘要。

因此,如果您正在批量处理多个项目,则当您第二次访问$(FullVersionNr)或者一个本地上下文已覆盖另一个本地上下文时(例如两次),本地上下文可能尚未合并回全局上下文子项目,第一个更新构建,但第二个不)。

对于您来说,一种可能的解决方案是使用MSDN文章中所述的注册表属性,并且只在更新其值时编写该属性。

+0

关于第二个链接和结论 - “当目标执行结束时,本地上下文中的更新值将合并回全局上下文。” - 对我来说这是** NOT **合并回全局上下文 – 2011-05-12 10:35:57

+0

@Krzy,你有'@(WebProj)'列表中有多个项目吗?如果是这样,请将'$(FullVersionNr)'设置为每一个唯一且可预测的内容,重新运行您的构建,并查看最后的值。如果它仍然与原始值相同,则没有合并任何上下文。如果它不同,那么你可以跟踪哪个项目改变了它。 – slugster 2011-05-12 11:46:22

+0

这是一个Web项目,其余项目都是按照项目进行构建的。它们都设置了相同的版本号,并且最后该值不会返回到第一个项目中,在该行中, 2011-05-12 12:20:09