Предварительная сборка задачи MSBuild для обновления AssemblyInfo не синхронизирована со встроенным исполняемым файлом

Я использую задачу предварительной сборки в 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 был изменен на «правильный».

Кажется, что изменения предварительной сборки не видны основной задаче компиляции и всегда отстают.

Любые идеи о том, что я делаю неправильно?


person Richard Morgan    schedule 12.02.2009    source источник
comment
Я не сумасшедший: social.msdn.microsoft.com/Forums/en-US/msbuild/thread/   -  person Richard Morgan    schedule 12.02.2009


Ответы (4)


Я не думаю, что вы делаете что-то не так - это ошибка.

Я сообщил об этом здесь — проверьте, можете ли вы воспроизвести его и добавьте проверку, возможно, мы сможем исправить это с помощью MS.

РЕДАКТИРОВАТЬ: я попробовал предложение «Si» обновить файл в событии «BeforeBuild», однако я все еще получаю тот же неправильный результат с Visual Studio 2008/SP1.

ОБНОВЛЕНИЕ/ВРЕМЕННОЕ РЕШЕНИЕ: MS ответила на сообщение об ошибке. В качестве обходного пути вы можете добавить

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

в ваш файл csproj.

person laktak    schedule 14.03.2009
comment
+1, потому что мы очень активно используем автоматически сгенерированный код, и после перехода с VS2005 на VS2008 (SP1) мы очень сильно пострадали от этой ошибки (которая на самом деле не кажется ошибкой, а по дизайну ... плохой дизайн!). Так что ваш ответ очень помогает. - person mmmmmmmm; 28.05.2009
comment
+1 решил мою проблему. Не забудьте поместить его в верхнюю ‹PropertyGroup›. - person Iain M Norman; 25.03.2010

+1 за трюк <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>, хотя ни в принятом решении, ни в связанной статье не указано, что эта строка должна быть добавлена ​​к первому элементу <PropertyGroup> в файле .csproj.

Это также проблема только с Visual Studio, так как вызов msbuild из командной строки в том же файле .csproj (без трюка) приведет к немедленной компиляции сгенерированных файлов кода (а не предыдущих версий). ).

Кроме того, я хотел бы порекомендовать, чтобы эта тема была помечена следующим образом, так как мне пришлось много копать, чтобы найти это:

  1. ВизуалСтудио
  2. компилятор
  3. Перед сборкой
  4. генерируется
  5. .СЕТЬ
  6. c#
person Community    schedule 28.09.2009

Интересно, я написал свою собственную задачу, которая подключена к BeforeBuild, и она отлично работает. Никогда не было проблем с VS или MSBuild через командную строку. Так что я бы посоветовал изучить BeforeBuild еще немного...

Я знаю, потому что мы используем номер сборки нашего сервера сборки (CruiseControl.NET) в качестве части «сборки» версии, которая встроена во все сборки (мы совместно используем один и тот же файл AssemblyInfo.cs для AssemblyVersion и AssemblyFileVersion для всех сборок в решении) и затем это передается (через задачу 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, мне нужно разрешение от моей работы, но если вы не можете найти ничего подходящего в сети, пользовательские задачи легко написать и выше должно помочь.

person si618    schedule 14.03.2009
comment
Какую версию/SP Visual Studio вы используете? - person laktak; 15.03.2009
comment
Мы начали с VS 2005 и .NET 2.0, а сейчас используем VS 2008 и .NET 3.5 (с последними исправлениями и SP). - person si618; 16.03.2009

Используйте что-то вроде ниже, чтобы изменить любой контент для любого файла. Здесь я меняю значение даты сборки в hallo.aspx каждый раз, когда создаю сборку.


например Содержимое Hallo.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)" /> 

person Gomes    schedule 06.09.2011