Как установить AssemblyVersion при использовании профилей публикации (.pubxml) из проекта веб-сайта?

Я использую новые ASP.Net и веб-инструменты 2012.2 Публикация профилей для веб-сайтов (не веб-приложения).

Я создал Профиль публикации с помощью инструментария, который создал файл website.publishproj в корне веб-сайта.

Файл website.publishproj содержит следующее:

<AssemblyAttributes Include="AssemblyFileVersion">
    <Value>$(AssemblyFileVersion)</Value>
</AssemblyAttributes>
<AssemblyAttributes Include="AssemblyVersion">
    <Value>$(AssemblyVersion)</Value>
</AssemblyAttributes>

Это предполагает, что вы можете передать свойства в MSBuild, чтобы установить версию выходной dll.

Однако единственная выходная сборка для веб-сайта (она компилируется и затем объединяется в единую сборку) всегда имеет номер версии 1.0.0.0.

Я пробовал передать /p:AssemblyFileVersion=2.1.0.0;AssemblyVersion=2.1.0.0, но это не дало результата.

Я даже пробовал редактировать файл website.publishproj напрямую, но это тоже не повлияло.

Кто-нибудь знает, как установить номер версии выходной сборки в веб-проекте Site, если вы хотите, чтобы она была объединена в единую сборку?


person gregpakes    schedule 28.02.2013    source источник


Ответы (3)


Мне удалось решить эту проблему. Я думаю, что это ошибка в инструментах.

Если вы установите для свойства OutputPath относительный путь в файле website.publishproj, тогда свойства AssemblyVersion и AssemblyFileVersion не соблюдаются.

Это связано с тем, как работает это управление версиями при объединении сборок веб-сайта в одну сборку.

Что происходит, так это то, что во время развертывания создается файл AssemblyInfo.cs и вводятся предоставленные номера версий. Этот AssemblyInfo.cs файл затем компилируется в AssemblyInfo.dll, содержащий номера версий, которые вы передали.

Затем вызывается aspnet_merge.exe с аргументом copyattrs, указывающим на AssemblyInfo.dll, сгенерированный ранее.

Если вы установите OutputPath на относительный путь, тогда этот copyattrs аргумент указывает на несуществующую dll. Это потому, что он запускается из пути, в котором находится инструмент aspnet_merge.exe. Следовательно, относительный путь к сборке AssemblyInfo.dll не позволяет найти ее истинное местоположение.

OutputPath не может быть относительным.

Чтобы решить эту проблему, я установил для себя следующее:

<PropertyGroup>
    <OutputPath>$(MSBuildProjectDirectory)\..\..\TempPackageBuildDir\</OutputPath>
</PropertyGroup>

Зачем вообще устанавливать OutputPath?

Если вы не устанавливаете OutputPath, он использует временный каталог в переменных вашей среды. В моем случае это привело бы к сбою сборки, потому что длина некоторых файлов превышала ограничение в 260 символов (у меня очень большой веб-сайт). Единственный способ заставить его построить вообще - это установить OutputPath на более пологий путь.

person gregpakes    schedule 01.03.2013
comment
Мне удалось отредактировать версию прямо в файле website.publishproj в элементах <AssemblyFileVersion> и <AssemblyVersion> в предыдущем блоке элементов <PropertyGroup>. Возможно, это новая функция после того, как этот вопрос был задан и дан ответ. Или ошибка была исправлена. Так или иначе. Надеюсь, это поможет кому-то другому. - person ahwm; 08.06.2020

У меня была аналогичная проблема, но по другой причине.

Путь MSBuild Options > Output folder моего проекта был установлен на путь, отличный от пути Publish > Connection > Target location, поэтому он не унаследовал информацию о версии от AssemblyInfo.dll

Надеюсь, это поможет кому-то другому.

person Awaterujin    schedule 02.07.2014

Для меня решением было добавить атрибуты в мой файл .pubxml.

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AssemblyVersion>2.3.0.0</AssemblyVersion>
    <AssemblyFileVersion>2.3.0.0</AssemblyFileVersion>
    ... rest of properties ...
  </PropertyGroup>
</Project>
person Mark Boltuc    schedule 16.10.2020