代码之家  ›  专栏  ›  技术社区  ›  Richard Morgan

用于更新assemblyinfo的预生成msbuild任务与生成的exe不同步

  •  20
  • Richard Morgan  · 技术社区  · 16 年前

    我正在使用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已被更改为“正确的”时间戳。

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

    你知道我做错了什么吗?

    4 回复  |  直到 16 年前
        1
  •  25
  •   laktak    16 年前

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

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

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

    更新/解决方法 :MS已响应错误报告。作为解决方案,您可以添加

    <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>
    

    到csproj文件。

        2
  •  14
  •   community wiki Olivier Dagenais    15 年前

    + 1 <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable> 技巧,尽管接受的解决方案和链接的文章都没有指定 该行应添加到 第一 <PropertyGroup> 元素在 .csproj 文件 .

    它也只是Visual Studio的一个问题,因为调用 MSBube 从同一命令行 CSPROJ 文件(不使用技巧)将立即看到生成的代码文件(而不是以前的版本)。

    此外,我还建议将此主题标记为以下内容,因为我必须进行大量挖掘才能找到它:

    1. VisualStudio
    2. 编译程序
    3. 预先建造
    4. 生成
    5. .NET
    6. C.*
        3
  •  2
  •   si618    16 年前

    有趣的是,我写了我自己的定制任务,它在构建之前就被勾住了,而且这个任务运行得很好。通过命令行从vs或msbuild中从未出现过问题。所以我想说,在建造之前先探索一下……

    我知道,因为我们使用构建服务器(CruiseControl.net)构建号作为版本的“构建”部分,该版本构建到所有程序集中(我们在解决方案中跨程序集共享用于assemblyversion和assemblyfileversion的相同assemblyinfo.cs),然后(通过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>
    

    如果你谷歌搜索,你应该找到其他的例子……对不起,我不能给你更新版本代码,我需要我的工作许可,但如果你找不到任何适合的网络,自定义任务很容易写,以上应该有帮助。

        4
  •  0
  •   Gomes    13 年前

    使用类似下面的内容更改任何文件的任何内容。在这里,每当我创建一个构建时,我都会更改hallo.aspx中的构建日期值。


    例如Hallo.aspx内容

    <建设日期:2011年12月23日


    <!-- 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)" />