Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

EDIT: я попробовал предложение "Si" обновить файл в событии "BeforeBuild", но я все равно получаю тот же неправильный результат с Visual Studio 2008/SP1.

UPDATE/WORKAROUND. MS ответила на отчет об ошибке. В качестве обходного пути вы можете добавить

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

в файл csproj.

Ответ 2

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

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

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

  • VisualStudio
  • компилятор
  • BeforeBuild
  • генерируется
  • .NET
  • С#

Ответ 3

Интересно, что я написал свою собственную задачу, которая подключена к 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>

Если вы делаете какой-то поиск в Google, вы должны найти другие примеры... извините, я не могу дать вам код UpdateVersion, мне нужно будет разрешение от моей работы, но если вы не найдете ничего подходящего в сети, задачи легко записываются, и это должно помочь.

Ответ 4

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


например. Содержание Hallo.aspx

<BuildDate> 12-23.2011 </BuildDate>


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