预构建 MSBuild 任务以更新与构建的 exe 不同步的 AssemblyInfo

Posted

技术标签:

【中文标题】预构建 MSBuild 任务以更新与构建的 exe 不同步的 AssemblyInfo【英文标题】:Pre-build MSBuild task to update AssemblyInfo not in sync with built exe 【发布时间】:2010-10-07 04:38:12 【问题描述】:

我在 Visual Studio 2008 中使用调用 msbuild 的预构建任务:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe $(MSBuildProjectDirectory)\version.targets /p:Configuration=$(ConfigurationName)

在 version.targets 中,我正在更新 AssemblyInfo.cs 文件以替换版本信息:

   <FileUpdate
        Encoding="ASCII"
        Files="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"
        Regex="AssemblyInformationalVersion\(&quot;.*&quot;\)\]" 
        ReplacementText="AssemblyInformationalVersion(&quot;Product $(ConfigurationString) ($(buildDate))&quot;)]"
    />

当我通过 Visual Studio 2008 构建项目时,它的构建没有任何问题。

但是当我查看生成的 exe 的版本信息时,它包含以前的时间戳,即使 AssemblyInfo.cs 已更改为“正确”的时间戳。

主编译任务似乎看不到预构建的更改,并且总是落后。

对我做错了什么有任何想法吗?

【问题讨论】:

我没疯:social.msdn.microsoft.com/Forums/en-US/msbuild/thread/… 【参考方案1】:

我不认为你做错了什么 - 这是一个错误。

我已经报告了它here - 检查你是否可以复制它并添加验证,也许我们可以让 MS 修复它。

编辑:我尝试了“Si”的建议来更新“BeforeBuild”事件中的文件 - 但是我仍然得到与 Visual Studio 2008/SP1 相同的错误结果。

更新/解决方法:MS 已回复错误报告。作为一种解决方法,您可以添加

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

到您的 csproj 文件。

【讨论】:

+1 因为我们非常频繁地使用自动生成的代码,并且在从 VS2005 切换到 VS2008(SP1) 之后,我们深受这个错误的影响(实际上这似乎不是错误,而是设计使然。 ..糟糕的设计!)。所以你的回答很有帮助。 +1 解决了我的问题。不要忘记将它放在顶部 【参考方案2】:

+1 表示 &lt;UseHostCompilerIfAvailable&gt;FALSE&lt;/UseHostCompilerIfAvailable&gt; 技巧,尽管已接受的解决方案和链接的文章都没有指定 该行应添加到 first .csproj 中的 &lt;PropertyGroup&gt; 元素文件

这也是仅 Visual Studio 的问题,因为从命令行对同一 .csproj 文件(没有技巧)调用 msbuild 将看到生成的代码文件立即编译(而不是以前的版本)。

另外,我想建议用以下标签来标记这个主题,因为我必须挖掘很多才能找到它:

    VisualStudio 编译器 构建之前 生成 .NET c#

【讨论】:

【参考方案3】:

有趣的是,我编写了自己的自定义任务,该任务与 BeforeBuild 挂钩,并且运行良好。通过命令行从未遇到过来自 VS 或 MSBuild 的问题。所以我想说多探索一下 BeforeBuild...

我知道是因为我们使用我们的构建服务器 (CruiseControl.NET) 构建号作为版本的“构建”部分,它内置于所有程序集中(我们在解决方案),然后将其推送(通过 FileUpdate 任务)到我们 WiX 项目中的变量,并用于标记 MSI 文件名。

<Target Name="BeforeBuild">
  <CallTarget Targets="UpdateAssemblyInfo" />
</Target>

<Target Name="UpdateAssemblyInfo" Condition="'$(CIBuildNumber)' != ''">
  <UpdateVersion Attribute="AssemblyFileVersion"
    AssemblyInfo=".\Properties\AssemblyInfo.cs" 
    BuildNumber="$(CIBuildNumber)" />
</Target>

如果您进行谷歌搜索,您应该找到其他示例...抱歉,我无法为您提供 UpdateVersion 代码,我需要获得我的工作许可,但如果您在网上找不到任何合适的内容,请自定义任务很容易编写,以上内容应该会有所帮助。

【讨论】:

您使用的是 Visual Studio 的哪个版本/SP? 我们从 VS 2005 和 .NET 2.0 开始,现在正在使用 VS 2008 和 .NET 3.5(带有最新的修补程序和 SP)【参考方案4】:

使用以下内容更改任何文件的任何内容。每次创建构建时,我都会更改 hallo.aspx 中的构建日期值。


例如你好.aspx 内容

12-23.2011


<!-- regular expression to get value between html node: "[^<>]+(?=[<])" --> 
  <FileUpdate Files="$(AboutDir)Hallo.aspx" 
    Regex="Builddate[^&lt;&gt;]+(?=[&lt;])" ignoreCase="true" 
    ReplacementText="BuildDate: $(Day)-$(Month)-$(Year)" /> 

【讨论】:

以上是关于预构建 MSBuild 任务以更新与构建的 exe 不同步的 AssemblyInfo的主要内容,如果未能解决你的问题,请参考以下文章

在Visual Studio中的MSBuild社区任务BeforeBuild步骤期间找不到路径中的xsd.exe

Bamboo 随机运行不同版本的 msbuild.exe 并构建失败

为啥 CruiseControl.NET 无法构建,但使用命令行中的 msbuild.exe 有效?

buildbot C++ 在 Windows 上构建:使用 devenv.com、vcbuild.exe 还是 MSBuild.exe?

SpecsFor MVC / MSBuild.exe 无法在 Visual Studio 2012 中正确构建/发布项目

MSBuild 中的 FxCop 和禁用 CA0060 异常