Предварительная сборка задачи MSBuild для обновления AssemblyInfo, не синхронизированной со встроенным exe - PullRequest
20 голосов
/ 12 февраля 2009

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

25 голосов
/ 14 марта 2009

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

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

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

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

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

в ваш файл csproj.

14 голосов
/ 28 сентября 2009

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

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

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

  1. VisualStudio
  2. компилятор
  3. BeforeBuild
  4. 1024 * генерироваться *
  5. .NET
  6. с #
2 голосов
/ 14 марта 2009

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

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

0 голосов
/ 06 сентября 2011

Используйте что-то вроде ниже, чтобы изменить любой контент для любого файла. Здесь я меняю значение даты сборки в 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)" /> 

...