MsBuild 任务和属性范围

3

我有一个构建项目,目标是构建。

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

在构建过程中,我将 $(FullVersionNr) 设置为精确的程序集号码,但最终结果并不是这个号码。

我甚至在另一个文件中声明了 $(FullVersionNr) 属性。

<Import Project="Common.proj"/>

而且它没有被传递出去。

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

1个回答

2
这篇MSDN文章应该会给你一些关于如何实现这个目标的想法:MSBuild Properties。更具体地说,这篇博客文章应该能回答你的作用域问题:Scope of properties and item in an MSBuild script。一定要仔细阅读结尾的总结。
因此,如果你正在批处理多个项目,可能在第二次访问$(FullVersionNr)时,本地上下文尚未合并回全局上下文,或者一个本地上下文已经覆盖了另一个(即两个子项目,第一个更新了构建,但第二个没有)。
你的一个可能的解决方案是使用MSDN文章中描述的注册表属性,并且只有在其值被更新时才写入该属性。

关于第二个链接和结论 - “当目标执行结束时,本地上下文中的更新值将合并回全局上下文。” - 在我的情况下,它没有合并回全局上下文。 - Krzysztof Król
@Krzy,你在@(WebProj)列表中有多个项目吗?如果是这样,请在每个项目中将$(FullVersionNr)设置为唯一且可预测的值,重新运行构建,并查看最终值是什么。如果它仍然与原始值相同,则表示没有合并任何上下文。如果不同,则可以跟踪更改它的项目。 - slugster
这是一个Web项目,其余的项目都作为依赖项目构建。它们都设置相同的版本号,但最终这个值没有返回到第一个项目中,在该项目中有以下代码行: <MSBuild Projects="@(WebProj)" > - Krzysztof Król

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接