【发布时间】:2014-07-04 01:10:43
【问题描述】:
我要做的就是在从 Visual Studio 2010 构建时分配一个具有从外部文件解析的值的项目属性。具体来说,我想在 Sandcastle 帮助文件生成器项目中填充 HelpFileVersion(请参阅我的线程 here具体)。
从 VS 构建时,仅在加载项目时评估属性,因此我认为我可以在构建时在 MSBuild 任务中重新评估此属性,如下所示(在我的 shfbproj 中):
<Target Name="BeforeBuildHelp">
<PropertyGroup>
<HelpFileVersion>{@Major}.{@Minor}.{@Build}.{@Revision}</HelpFileVersion>
<In>$([System.IO.File]::ReadAllText('$(MSBuildProjectDirectory)\..\SolutionInfo.cs'))</In>
<Pattern>^\s*\[assembly: AssemblyVersion\(\D*(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Major>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[1].Value)</Major>
<Minor>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[2].Value)</Minor>
<Build>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[3].Value)</Build>
<Revision>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern), System.Text.RegularExpressions.RegexOptions.Multiline).Groups[4].Value)</Revision>
</PropertyGroup>
<Message Importance="High" Text="HelpFileVersion: $(Major).$(Minor).$(Build).$(Revision)" />
</Target>
这在直接从 MSBuild 或命令行构建时工作得很好,但是如果我在 VS 中更新外部文件,更新的版本(如上面的 MSBuild 任务中设置)不会返回到 IDE 的 HelpFileVersion 实例属性,直到我重新加载项目(这对我来说效果不太好,我记得要做)。我知道我的 Major、Minor、Build 和 Revision 属性正在正确更新(通过消息任务看到)。在我上面列出的另一个线程中,SHFB 工具的作者提到:
“据我所知,Visual Studio 仅编辑在项目根级别找到的项目属性,并且不会在单独的构建任务(例如 BeforeBuildHelp)中看到任何属性。”
所以,我的问题是,你们中是否有人知道一种方法,从 Visual Studio 2010 构建,让我在构建时通过 MSBuild 任务或其他方式更新 IDE 的属性实例?我尝试了多种方式设置属性(CreateProperty、PropertyGroup、使用 DependsOn 属性、使用 CallTarget 等),每次我都能在任务中获得正确的值,但 IDE 的属性中的值总是过时的(通过回显看到它来自 PostBuildEvent)。
【问题讨论】:
标签: c# visual-studio-2010 msbuild