【问题标题】:How to update an IDE's instance of a project property in an MSBuild Task (building from VS2010, not MSBuild)如何在 MSBuild 任务中更新 IDE 的项目属性实例(从 VS2010 构建,而不是 MSBuild)
【发布时间】: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


    【解决方案1】:

    见:

    Visual Studio 实际上将构成您的解决方案的文件保存在内存中以提高其性能。 MsBuild 实际上会检测到它在 Visual Studio 中运行,并将从内存缓存中获取文件,而不是从磁盘中获取它们。

    问题是在构建期间对解决方案中的文件所做的任何更改都不会被 MsBuild 拾取,直到您下次构建项目时。内部工作原理在 MSDN 论坛的这篇文章中进行了解释。

    见:

    在我们的例子中,我们决定让 MsBuild 使用磁盘上的文件,方法是在我们试图动态修补的项目文件的第一个属性组中将“UseHostCompilerIfAvailable”属性设置为“false”。

    见:

    【讨论】:

    • 感谢您的建议。不幸的是,将“FALSE”添加到我的 shfbproj 项目文件的第一个 PropertyGroup 并不能更新 HelpFileVersion 属性。我尝试在与 UseHostCompilerIfAvailable 相同的 PropertyGroup 以及“BeforeBuildHelp”MSBuild 任务中设置我的 HelpFileVersion 属性。我想知道原因是否是您正在修改您的文件,而我只是想修改我的属性?在 VS 中加载我的项目后,我无法更新我的项目的 HelpFileVersion 实例。
    • 似乎我完全误解了你是如何做到这一点的,我重读了你的问题,我想这不是你遇到的问题。但是由于 IDE 从项目文件中读取它,我想您需要实际更新项目文件。
    • 再次感谢您抽出宝贵时间对此进行调查。有一次,我试图在构建时从 MSBuild 任务更新项目文件。似乎 VS 不想在构建期间重新加载项目文件,但我应该进一步研究。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多